R:保持c2值的长度,使用c1值作为列名
我有一个超过3000 obs的数据帧。看起来与此类似: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 #
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
spldfAdata.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列时,这非常有效,正如上面的示例所示。非常感谢。