如何拆分数据框?
我想将一个dataframe分成几个较小的数据。 这看起来像一个非常微不足道的问题,但我无法从networkingsearchfind解决scheme。
您可能还想将dataframe剪切成任意数量的较小的dataframe。 在这里,我们分成两个数据框。
x = data.frame(num = 1:26, let = letters, LET = LETTERS) set.seed(10) split(x, sample(rep(1:2, 13)))
给
$`1` num let LET 3 3 c C 6 6 f F 10 10 j J 12 12 l L 14 14 n N 15 15 o O 17 17 q Q 18 18 r R 20 20 t T 21 21 u U 22 22 v V 23 23 w W 26 26 z Z $`2` num let LET 1 1 a A 2 2 b B 4 4 d D 5 5 e E 7 7 g G 8 8 h H 9 9 i I 11 11 k K 13 13 m M 16 16 p P 19 19 s S 24 24 x X 25 25 y Y
如果你想根据某些variables的值拆分一个数据daply()
,我build议使用plyr
包中的daply()
。
library(plyr) x <- daply(df, .(splitting_variable), function(x)return(x))
现在, x
是一个数据框的数组。 要访问其中一个数据框,可以使用分割variables的级别名称对其进行索引。
x$Level1 #or x[["Level1"]]
我相信,在将数据分解成多个数据框之前,没有其他更聪明的方法来处理数据。
我刚刚发布了一种RFC,可能会帮助你: 在R中将一个vector拆分成块
x = data.frame(num = 1:26, let = letters, LET = LETTERS) ## number of chunks n <- 2 dfchunk <- split(x, factor(sort(rank(row.names(x))%%n))) dfchunk $`0` num let LET 1 1 a A 2 2 b B 3 3 c C 4 4 d D 5 5 e E 6 6 f F 7 7 g G 8 8 h H 9 9 i I 10 10 j J 11 11 k K 12 12 l L 13 13 m M $`1` num let LET 14 14 n N 15 15 o O 16 16 p P 17 17 q Q 18 18 r R 19 19 s S 20 20 t T 21 21 u U 22 22 v V 23 23 w W 24 24 x X 25 25 y Y 26 26 z Z
干杯,塞巴斯蒂安
你也可以使用
data2 <- data[data$sum_points == 2500, ]
这将使sum_points = 2500的值的dataframe
它给 :
airfoils sum_points field_points init_t contour_t field_t ... 491 5 2500 5625 0.000086 0.004272 6.321774 498 5 2500 5625 0.000087 0.004507 6.325083 504 5 2500 5625 0.000088 0.004370 6.336034 603 5 250 10000 0.000072 0.000525 1.111278 577 5 250 10000 0.000104 0.000559 1.111431 587 5 250 10000 0.000072 0.000528 1.111524 606 5 250 10000 0.000079 0.000538 1.111685 .... > data2 <- data[data$sum_points == 2500, ] > data2 airfoils sum_points field_points init_t contour_t field_t 108 5 2500 625 0.000082 0.004329 0.733109 106 5 2500 625 0.000102 0.004564 0.733243 117 5 2500 625 0.000087 0.004321 0.733274 112 5 2500 625 0.000081 0.004428 0.733587
subset()也是有用的
subset(DATAFRAME, COLUMNNAME == "")
对于调查scheme,也许“调查”scheme是相关的?
你想要的答案很大程度上取决于你如何以及为什么要打破数据框架。
例如,如果您想省略一些variables,则可以从数据库的特定列创build新的dataframe。 数据框后括号内的下标是指行号和列号。 检查Spoetry的完整说明。
newdf <- mydf[,1:3]
或者,您可以select特定的行。
newdf <- mydf[1:3,]
这些下标也可以是逻辑testing,例如select包含特定值的行或具有期望值的因子。
你想用剩下的块做什么? 你是否需要对每个数据库块执行相同的操作? 然后,您需要确保数据框的子集以方便的对象(如列表)结束,这将有助于您在数据框的每个块上执行相同的命令。
如果你想在一列中按值分割,你可以使用lapply
。 例如,要将ChickWeight
分割为每个小鸡的单独数据集:
data(ChickWeight) lapply(unique(ChickWeight$Chick), function(x) ChickWeight[ChickWeight$Chick == x,])
分割dataframe似乎适得其反。 相反,使用split-apply-combine范例,例如生成一些数据
df = data.frame(grp=sample(letters, 100, TRUE), x=rnorm(100))
然后只拆分相关的列,并将scale()
函数应用于每个组中的x,然后合并结果(使用split<-
或ave
>
df$z = 0 split(df$z, df$grp) = lapply(split(df$x, df$grp), scale) ## alternative: df$z = ave(df$x, df$grp, FUN=scale)
与分裂dataframe相比,这将是非常快速的,并且结果在没有迭代的下游分析中仍然可用。 我认为dplyr的语法是
library(dplyr) df %>% group_by(grp) %>% mutate(z=scale(x))
一般来说,这个dplyr解决scheme比分割dataframe更快,但是速度不如split-apply-combine快。