将行值组透视到R中的列中

8cdiaqws  于 2023-11-14  发布在  其他
关注(0)|答案(2)|浏览(113)

我在R中有一个这样的框架(C1和C2列):

C1      C2  
1       A  
1       H   
1       C   
2       D   
2       R      
2       G  
3       Z    
3       L   
3       M

字符串
我想这样做:
我尝试过的选项都没有给我这个布局。

wd2eg0qa

wd2eg0qa1#

这可能是有用的:

X <- c(1,1,1,2,2,2,3,3,3)
Y <- c("A","H","C","D","R","G","Z","L","M")
DF <- data.frame(C1=X, C2=Y)
DF

字符串
$$C1\,C2\ 1 \,A \ 1 \,H \ 1 \,C \ 2 \,D \ 2 \,R \ 2 \,G \ 3 \,Z \ 3 \,L \ 3 \,M \

t <- NULL 
for (i in 1:max(X)){
t[[i]] <-   DF$C2[which(DF$C1 %in% i)]
}

TDF <- data.frame("1"= t[[1]], "2" = t[[2]], "3" = t[[3]])
TDF


$$X1\,X2 \,X3 \ A \,D \,Z \ H \,R \,L \ C \,G \,M \$$

dzjeubhm

dzjeubhm2#

首先,你的问题,如上所述,没有解决方案,因为你不能使用整数作为列名。
但更重要的是,你想做的事情实际上在“整洁”数据方面没有意义。
在整理数据中,每一行都应该代表一个唯一的“观察”。然而,在你给予的原始框架中,集合{A,D,Z}之间没有关联,目标框架中的其他行也是如此。因此,没有一组整理操作会达到你想要的效果。
但是,如果您创建了另一个列来关联它们,则可以在spread运算符中使用该列来获得所需的内容。

library(tidyverse)

df1 = data.frame(
  C1 = rep(c(1,2,3), each=3),
  C2 = LETTERS[1:9]
)

df1 %>%  spread(C1, C2)
#> Error: Each row of output must be identified by a unique combination of keys.
#> Keys are shared for 9 rows:
#> * 1, 2, 3
#> * 4, 5, 6
#> * 7, 8, 9

df2 = data.frame(
  C1 = rep(c(1,2,3), each=3),
  C2 = LETTERS[1:9],
  C3 = rep(c(1,2,3), times=3)
)

df2 %>% spread(C3, C2)
#>   C1 1 2 3
#> 1  1 A B C
#> 2  2 D E F
#> 3  3 G H I

字符串
创建于2020-05-08由reprex package(v0.3.0)

相关问题