R:保持c2值的长度,使用c1值作为列名

R:保持c2值的长度,使用c1值作为列名,r,R,我有一个超过3000 obs的数据帧。看起来与此类似: dat <- data.frame( letter = rep(c("A", "B", "C"), each=4), numbers = rep(seq(1,1.75, by=0.25), 3) ) dat # letter numbers # 1 A 1.00 # 2 A 1.25 # 3 A 1.50 #

我有一个超过3000 obs的数据帧。看起来与此类似:

dat <- data.frame(
  letter = rep(c("A", "B", "C"), each=4),
  numbers = rep(seq(1,1.75, by=0.25), 3)
  )
dat
# letter numbers
# 1       A    1.00
# 2       A    1.25
# 3       A    1.50
# 4       A    1.75
# 5       B    1.00
# 6       B    1.25
# 7       B    1.50
# 8       B    1.75
# 9       C    1.00
# 10      C    1.25
# 11      C    1.50
# 12      C    1.75
无需手动硬编码所有3000个观测值

到目前为止,我尝试过的所有工具(重塑、拆分、分组拆分、变异%>%split%>%Unest、pivot\u Wither和dcast)中,split提供了与我尝试实现的最接近的输出(见下文),但我不确定如何为嵌套在数据帧中的数据帧的特定列编制索引,我不确定如何在不连接单个数据帧的情况下重新组合这些数据帧,也就是说,我希望每个字母下的所有值彼此独立

spldf <- split(dat, dat$letter)
spldf

# $A
# letter numbers
# 1      A    1.00
# 2      A    1.25
# 3      A    1.50
# 4      A    1.75
# 
# $B
# letter numbers
# 5      B    1.00
# 6      B    1.25
# 7      B    1.50
# 8      B    1.75
# 
# $C
# letter numbers
# 9       C    1.00
# 10      C    1.25
# 11      C    1.50
# 12      C    1.75

spldfA
data.table
选项使用
dcast

dcast(setDT(dat),rowid(letter)~letter,value.var = "numbers")[,-1]
给予


使用
dcast的
data.table
选项

dcast(setDT(dat),rowid(letter)~letter,value.var = "numbers")[,-1]
给予


如果“字母”列的元素数相同,我们可以使用
unstack
以及
base R

unstack(dat, numbers ~ letter)
-输出

#    A    B    C
#1 1.00 1.00 1.00
#2 1.25 1.25 1.25
#3 1.50 1.50 1.50
#4 1.75 1.75 1.75

但是,如果数据真的很大,长度不等的可能性就更大。在这种情况下,我们需要一个序列列,以确保如果长度较小,则可以使用
NA

library(dplyr)
library(tidyr)
library(data.table)
dat %>% 
    mutate(rn = rowid(letter)) %>%
    pivot_wider(names_from = letter, values_from = numbers) %>% 
    select(-rn)

如果“字母”列的元素数相同,我们可以使用
unstack
以及
base R

unstack(dat, numbers ~ letter)
-输出

#    A    B    C
#1 1.00 1.00 1.00
#2 1.25 1.25 1.25
#3 1.50 1.50 1.50
#4 1.75 1.75 1.75

但是,如果数据真的很大,长度不等的可能性就更大。在这种情况下,我们需要一个序列列,以确保如果长度较小,则可以使用
NA

library(dplyr)
library(tidyr)
library(data.table)
dat %>% 
    mutate(rn = rowid(letter)) %>%
    pivot_wider(names_from = letter, values_from = numbers) %>% 
    select(-rn)

您仍然可以在tidyverse框架中执行此操作,但是您需要添加一个id变量来标记字母中的数字序列

库(tidyverse)
dat%分组单位(字母)%>%
变异(id=1:n())%>%
枢轴更宽(id\U cols=id,
姓名=字母,
值\u from=数字)%>%
选择(-id)
#>#tibble:4 x 3
#>A、B、C
#>     
#> 1  1     1     1   
#> 2  1.25  1.25  1.25
#> 3  1.5   1.5   1.5 
#> 4  1.75  1.75  1.75

由(v0.3.0)于2021-02-10创建,您仍然可以在tidyverse框架中执行此操作,但您需要添加一个id变量来标记字母中的数字序列

库(tidyverse)
dat%分组单位(字母)%>%
变异(id=1:n())%>%
枢轴更宽(id\U cols=id,
姓名=字母,
值\u from=数字)%>%
选择(-id)
#>#tibble:4 x 3
#>A、B、C
#>     
#> 1  1     1     1   
#> 2  1.25  1.25  1.25
#> 3  1.5   1.5   1.5 
#> 4  1.75  1.75  1.75

在2021-02-10年由(v0.3.0)

创建,当我将实际数据框缩减为2列时,它运行得非常好,如上面的示例所示。非常感谢。当我将实际的数据帧减少到2列时,这非常有效,正如上面的示例所示。非常感谢。