在R中操纵数据帧

苹果门0

我试图将我的数据从下一个数据框调到下一个数据框,其中B列和C列的值组合为D列的值的列名,并按A列的值分组。

以下是可重现的示例。

set.seed(10)

fooDF <- data.frame(A = sample(1:4, 10, replace=TRUE), B = sample(letters[1:4], 10, replace=TRUE), C= sample(letters[1:4], 10, replace=TRUE), D = sample(1:4, 10, replace=TRUE))
fooDF[!duplicated(fooDF),]

   A B C D
1  4 c b 2
2  4 d a 2
3  2 a b 4
4  3 c a 1
5  4 a b 3
6  4 b a 2
7  1 b d 2
8  1 a d 4
9  2 b a 3
10 2 d c 2

newdata <- data.frame(A = 1:4)
for(i in 1:nrow(fooDF)){
    col_name <- paste(fooDF$B[i], fooDF$C[i], sep="")
    newdata[newdata$A == fooDF$A[i], col_name ] <- fooDF$D[i]


}

我正在尝试获取的格式。

> newdata
  A cb da ab ca ba bd ad dc
1 1 NA NA NA NA NA  2  4 NA
2 2 NA NA  4 NA  3 NA NA  2
3 3 NA NA NA  1 NA NA NA NA
4 4  2  2  3 NA  2 NA NA NA

现在,我正在逐行执行此操作,但这对于包含500万行以上的大型csv是不可行的。有没有办法在R或python中更快地做到这一点?

阿克伦

在中R,可以使用tidyr

library(tidyr)
fooDF %>%
     unite(BC, B, C, sep="")  %>%
     spread(BC, D)
#  A ab ad ba bd ca cb da dc
#1 1 NA  4 NA  2 NA NA NA NA
#2 2  4 NA  3 NA NA NA NA  2
#3 3 NA NA NA NA  1 NA NA NA
#4 4  3 NA  2 NA NA  2  2 NA

或者我们可以用 dcast

library(data.table)
dcast(setDT(fooDF), A~paste0(B,C), value.var = "D")
#    A ab ad ba bd ca cb da dc
#1: 1 NA  4 NA  2 NA NA NA NA
#2: 2  4 NA  3 NA NA NA NA  2
#3: 3 NA NA NA NA  1 NA NA NA
#4: 4  3 NA  2 NA NA  2  2 NA

数据

fooDF <- structure(list(A = c(4L, 4L, 2L, 3L, 4L, 4L, 1L, 1L, 2L, 2L), 
B = c("c", "d", "a", "c", "a", "b", "b", "a", "b", "d"), 
C = c("b", "a", "b", "a", "b", "a", "d", "d", "a", "c"), 
D = c(2L, 2L, 4L, 1L, 3L, 2L, 2L, 4L, 3L, 2L)), .Names = c("A", 
"B", "C", "D"), class = "data.frame", row.names = c("1", "2", 
"3", "4", "5", "6", "7", "8", "9", "10"))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章