我需要用一行中的各列表示分组数据。例如:在R中的每个组中以单个行表示数据
数据集所需
ID Action_Number
1 A
1 B
1 C
2 D
2 E
输出是: -
1 A B C
2 D E
我已经通过技术尝试了各种团体和调换,但无法得到精确的输出。请帮忙。
我需要用一行中的各列表示分组数据。例如:在R中的每个组中以单个行表示数据
ID Action_Number
1 A
1 B
1 C
2 D
2 E
输出是: -
1 A B C
2 D E
我已经通过技术尝试了各种团体和调换,但无法得到精确的输出。请帮忙。
最简单的办法是通过 'ID' split
的 'Action_Number' 到vector
s的list
输出
split(df1$Action_Number, df1$ID)
但是,如果我们需要一个data.frame/data.table
,然后dcast
可用于
library(data.table)#1.9.7+
dcast(setDT(df1), ID~rowid(ID), value.var = 'Action_Number')
请注意,rowid
可用于data.table
的开发版本。所以,如果我们有一个版本的data.table
即< 1.9.7,然后创建一个序列变量,然后执行dcast
dcast(setDT(df1)[, rn := 1:.N, by = ID], ID ~ rn, value.var = 'Action_Number')
如果你也想保持他们作为一个列表,而不是,你可以这样做:
df = data.frame(ID=c(1, 1, 1, 2, 2), Action_Number = c('A', 'B', 'C', 'D', 'E'), stringsAsFactors = F)
unique_IDs <- unique(df$ID)
l = list()
for(i in 1:length(unique_IDs)){
l[[i]] <- df[df$ID == i,"Action_Number"]
}
其在这里l
为您提供:
[[1]]
[1] "A" "B" "C"
[[2]]
[1] "D" "E"
使用tidyverse
(dplyr
和tidyr
)
tab <- readr::read_delim("ID Action_Number
1 A
1 B
1 C
2 D
2 E", delim = " ")
tab %>%
dplyr::group_by(ID) %>%
dplyr::mutate(rn = paste0("V", 1:n())) %>%
tidyr::spread(rn, Action_Number)
#> Source: local data frame [2 x 4]
#> Groups: ID [2]
#>
#> ID V1 V2 V3
#> * <int> <chr> <chr> <chr>
#> 1 1 A B C
#> 2 2 D E <NA>
您可能需要''split'分(DF1 $ Action_Number,DF1 $ ID)'或如果我们需要一个data.frame'库(data.table); dcast(setDT(DF1),ID 〜rowid(ID),value.var ='Action_Number')' – akrun
嗨..感谢您的帮助。此方法有效:) – Ankit