Skip to main content
 首页 » 编程设计

python之在 R 中操作数据框

2025年05月04日15langtianya

我正在尝试将我的数据从以下数据框混合到它后面的数据框中,其中 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"))