我正在尝试编写一个函数,该函数接受一个数据帧并将其分成多个数据帧,每指定数目的列。 例如,如果一个数据框看起来像这样:
df <- data.frame(
x1 = rnorm(1000),
x2 = rnorm(1000),
x3 = rnorm(1000),
x4 = rnorm(1000),
x5 = rnorm(1000),
x6 = rnorm(1000)
)
我想每隔一列拆分一次,然后将其保存为自己的数据框。 因此,伪代码应类似于:
function(df){
split df every second column
save each group as it's own unique data frame (named A-C for this example)
}
最终结果将意味着我有3个数据帧,其中数据帧A有两列(即x1,x2),类似地B有两列(x3,x4),C有两列(x5,x6)。
关于如何实现这一目标的任何建议?
答案 0 :(得分:4)
我们可以使用split.default
将其分为两列,每列分别为list
lst1 <- split.default(df, LETTERS[as.integer(gl(ncol(df), 2, ncol(df)))])
,然后使用write.csv
lapply(names(lst1), function(x) write.csv(lst1[[x]], paste0(x, ".csv")))
答案 1 :(得分:2)
我们可以使用split.default
将数据分成两列
temp <- split.default(df, gl(ncol(df)/2, 2))
temp
#$`1`
# x1 x2
#1 -0.560476 1.22408
#2 -0.230177 0.35981
#3 1.558708 0.40077
#4 0.070508 0.11068
#5 0.129288 -0.55584
#6 1.715065 1.78691
#7 0.460916 0.49785
#8 -1.265061 -1.96662
#9 -0.686853 0.70136
#10 -0.445662 -0.47279
#$`2`
# x3 x4
#1 -1.06782 0.426464
#2 -0.21797 -0.295071
#3 -1.02600 0.895126
#4 -0.72889 0.878133
#5 -0.62504 0.821581
#....
#....
我们可以将数据保留在列表中,或者如果需要,在单独的数据框中,我们可以这样做
names(temp) <- LETTERS[1:3]
list2env(temp, .GlobalEnv)
数据
set.seed(123)
df <- data.frame(
x1 = rnorm(10),
x2 = rnorm(10),
x3 = rnorm(10),
x4 = rnorm(10),
x5 = rnorm(10),
x6 = rnorm(10)
)