在R中每组代表一行数据

时间:2016-11-04 06:35:09

标签: r transpose

我需要在一行中用不同的列表示分组数据。例如:

数据集

ID Action_Number 
1    A            
1    B
1    C
2    D
2    E

所需的输出是: -

1  A  B  C 
2  D  E

我已经尝试了各种技术和转置,但无法获得准确的输出。请帮忙。

3 个答案:

答案 0 :(得分:1)

最简单的选择是split将'ID''的'Action_Number'转换为list的{​​{1}}输出

vector

但是,如果我们需要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版本是< 1.9.7,然后创建一个序列变量,然后执行data.table

dcast

答案 1 :(得分:1)

使用tidyversedplyrtidyr

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>

答案 2 :(得分:0)

如果您还希望将它们保留为列表,则可以执行以下操作:

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"