使用 apply 将(固定的)新行添加到 N 个数据集列表中每个数据集的顶部

Adding a (fixed) new row to the top of each dataset in a list of N datasets using apply

提问人:Marlen 提问时间:12/31/2022 最后编辑:Marlen 更新时间:1/1/2023 访问量:50

问:

我有 N 个数据集,这些数据集被加载到 RStudio 中并存储在列表对象“数据集”中。问题是我想成为它们中的每一行或它们中每个的标题,无论哪种方式都在它们的第三行。

我发布的这个问题的初始版本只有下面的段落描述了 N 个数据集中的每一个是什么样子的,但我意识到这还不够简单,所以现在我在该段落下方附上其中一个数据集的屏幕截图。

每个数据集是 503 x 31,第三行是“Y”、“X1”、“X2”、“...”、“X30”,每个数据集中的第一行是一行虚拟变量,因此它们都是 1 或 0,具体取决于条件。每个的第 2 行在第一个位置是黑色的,然后是“1”、“2”、“3”、“...”、“30”。enter image description here

我想从这里开始做的是将一个新行(相当于第 3 行)添加到列表对象数据集中每个 N 个数据帧元素的顶部,或者向它们添加适当的标题,这会更好。或者,找到一种方法来删除或删除第 2 行,然后使第 1 行和新的第 2 行交换位置。

我还冒昧地在源 csv 文件格式的数据集中添加了该新行,并对其进行了屏幕截图,以演示在我完成对这个问题的任何答案后,该数据集的 R 中的数据帧应该是什么样子 enter image description here

我是否可以以某种方式将 rbind() 函数与其中一个 apply 函数组合起来来完成此任务?

p.s. 每个数据帧的第 3 行下方只是 500 个变量中每个变量的 31 行观测值。

我已经尝试使用以下方法将上述行名添加到每个数据帧中:

lapply(datasets, function(i){
colnames(i) <- c("Y", "X1","X2", "X3", "X4","X5", "X6", "X7","X8", "X9",

              "X10","X11", "X12", "X13","X14", "X15", "X16","X17", 

              "X18", "X19","X20", "X21", "X22","X23", "X24", "X25",

              "X26", "X27", "X28","X29", "X30") }

但令我惊讶的是,这实际上并没有导致数据集发生任何永久性变化。

p.s. 我在此脚本中做的第二件事(在设置 WorkSpace 之后)是使用以下非正统方法加载以下库:

# load all necessary packages using only 1 command/line
library_list <- c(library(stats),library(plyr),library(dplyr),
                  library(tidyverse),library(tibble),library(readr),
                  library(leaps),library(lars),library(stringi),
                  library(purrr),library(parallel), library(vroom))

之后我只是运行 rm(library_list 立即),就像我从来没有做过奇怪的事情一样。我这样做是因为我的手是残疾人,所以拇指点击越少,单独运行每行越好!

R 操作 转换 整理 数据整理

评论


答:

1赞 TarJae 12/31/2022 #1

如果我理解正确,这应该有效:


library(janitor)
library(purrr)
library(dplyr)

# create a list

df1 <- read.table(header = FALSE, 
           text = '
           1 0 1 1 0
           1 2 3 4 5
           X1 X2 X3 X4 X5
           no no no no no')

df2 <- read.table(header = FALSE, 
                  text = '
           1 1 0 0 0
           6 7 8 9 10
           X1 X2 X3 X4 X5
           no no no no no')


my_list <- list(df1, df2)

基础 R

# create a custom function and then use it with lapply
my_renamer <- function(df, row=3){
  names(df) <- df[row,]
  df
}

lapply(my_list, function(x) my_renamer(x, 3))

OR with 和 s :purrrjanitorrow_to_names

map(my_list, ~row_to_names(., remove_rows_above = FALSE, 
                           remove_row = FALSE, 3))

OR 与 和 :lapplyjanitor

lapply(my_list, function(x) row_to_names(x, remove_rows_above = FALSE, 3))
[[1]]
  X1 X2 X3 X4 X5
1  1  0  1  1  0
2  1  2  3  4  5
3 X1 X2 X3 X4 X5
4 no no no no no

[[2]]
  X1 X2 X3 X4 X5
1  1  1  0  0  0
2  6  7  8  9 10
3 X1 X2 X3 X4 X5
4 no no no no no

评论

1赞 Marlen 12/31/2022
啊,在我花 5-15 分钟阅读您提出的解决方案然后尝试之前,我会先感谢您提醒我在这样的帖子中包含我已经加载的库,以表明我对使用任何外部包没有恐惧症或恐吓,如果它们有帮助!
0赞 Marlen 12/31/2022
老实说,我只是添加了一些急需的额外信息,我最初应该包括这些信息。希望它有助于澄清我需要什么和我在寻找什么。
1赞 TarJae 12/31/2022
您想要的输出应该由我提供的代码来完成。
1赞 Marlen 1/1/2023
匪夷所思!我很高兴听到这个消息,如果它有效,我稍后会告诉你。大约 13 小时前,我终于闭上眼睛,屏住呼吸,在我的 R 脚本中点击运行,该行将所有 260k 示例数据集加载到工作区中,从那时起,我的笔记本电脑一直在尝试非常响亮和热情地完成这项工作,现在仍在进行中!