提问人:Marlen 提问时间:12/31/2022 最后编辑:Marlen 更新时间:1/1/2023 访问量:50
使用 apply 将(固定的)新行添加到 N 个数据集列表中每个数据集的顶部
Adding a (fixed) new row to the top of each dataset in a list of N datasets using apply
问:
我有 N 个数据集,这些数据集被加载到 RStudio 中并存储在列表对象“数据集”中。问题是我想成为它们中的每一行或它们中每个的标题,无论哪种方式都在它们的第三行。
我发布的这个问题的初始版本只有下面的段落描述了 N 个数据集中的每一个是什么样子的,但我意识到这还不够简单,所以现在我在该段落下方附上其中一个数据集的屏幕截图。
每个数据集是 503 x 31,第三行是“Y”、“X1”、“X2”、“...”、“X30”,每个数据集中的第一行是一行虚拟变量,因此它们都是 1 或 0,具体取决于条件。每个的第 2 行在第一个位置是黑色的,然后是“1”、“2”、“3”、“...”、“30”。
我想从这里开始做的是将一个新行(相当于第 3 行)添加到列表对象数据集中每个 N 个数据帧元素的顶部,或者向它们添加适当的标题,这会更好。或者,找到一种方法来删除或删除第 2 行,然后使第 1 行和新的第 2 行交换位置。
我还冒昧地在源 csv 文件格式的数据集中添加了该新行,并对其进行了屏幕截图,以演示在我完成对这个问题的任何答案后,该数据集的 R 中的数据帧应该是什么样子
我是否可以以某种方式将 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 立即),就像我从来没有做过奇怪的事情一样。我这样做是因为我的手是残疾人,所以拇指点击越少,单独运行每行越好!
答:
如果我理解正确,这应该有效:
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 :purrr
janitor
row_to_names
map(my_list, ~row_to_names(., remove_rows_above = FALSE,
remove_row = FALSE, 3))
OR 与 和 :lapply
janitor
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
评论