R:按列拆分数据框
R: Splitting dataframe columnwise
我有一个具有这种结构的数据框
x = data.frame(let = letters, LET = LETTERS, num1 = 1:26, num2 = 21:46, num3 = 71:96, num4 = 68:93 )
我想把它分成 3 列的列表 dataframes.The 前两列 let 和 LET 仍然很常见,第三列各不相同。第一个数据帧是 (let, LET, num1) 第二个数据帧是 (let, LET, num2) 等等.
我目前的策略是将数据帧转换为长格式并使用 plyr 和 dplyr 包根据 num 拆分它。有没有更简单的方法来完成这个任务。
您可以像这样使用 lapply
作为示例
lapply(1:4, function(D) x[ ,c("let", "LET", paste0("num", D))])
如果您不知道 num*
列的列名,您可以使用
nonLetNames <- names(x)[!(names(x) %in% c("let", "LET"))]
lapply(nonLetNames, function(nom) x[ ,c("let", "LET", nom)])
这是一个基于 Map
的方法
Map(function(x,y,z) setNames(cbind(x,y), c(names(x), z)),
list(x[1:2]), x[-(1:2)], names(x)[-(1:2)])
我有一个具有这种结构的数据框
x = data.frame(let = letters, LET = LETTERS, num1 = 1:26, num2 = 21:46, num3 = 71:96, num4 = 68:93 )
我想把它分成 3 列的列表 dataframes.The 前两列 let 和 LET 仍然很常见,第三列各不相同。第一个数据帧是 (let, LET, num1) 第二个数据帧是 (let, LET, num2) 等等.
我目前的策略是将数据帧转换为长格式并使用 plyr 和 dplyr 包根据 num 拆分它。有没有更简单的方法来完成这个任务。
您可以像这样使用 lapply
作为示例
lapply(1:4, function(D) x[ ,c("let", "LET", paste0("num", D))])
如果您不知道 num*
列的列名,您可以使用
nonLetNames <- names(x)[!(names(x) %in% c("let", "LET"))]
lapply(nonLetNames, function(nom) x[ ,c("let", "LET", nom)])
这是一个基于 Map
的方法
Map(function(x,y,z) setNames(cbind(x,y), c(names(x), z)),
list(x[1:2]), x[-(1:2)], names(x)[-(1:2)])