2016-11-04 46 views
-1

我需要用一行中的各列表示分组数据。例如:在R中的每个组中以单个行表示数据

数据集所需

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

输出是: -

1 A B C 
2 D E 

我已经通过技术尝试了各种团体和调换,但无法得到精确的输出。请帮忙。

+1

您可能需要''split'分(DF1 $ Action_Number,DF1 $ ID)'或如果我们需要一个data.frame'库(data.table); dcast(setDT(DF1),ID 〜rowid(ID),value.var ='Action_Number')' – akrun

+0

嗨..感谢您的帮助。此方法有效:) – Ankit

回答

1

最简单的办法是通过 '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') 
+0

嗨,非常感谢。它的工作..我尝试使用dcast之前,但不知何故无法得到确切的输出。你的方法很完美。 :) – Ankit

+1

@Ankit感谢您的评论。你也可以勾选[here](http://stackoverflow.com/help/someone-answers) – akrun

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" 
0

使用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> 
相关问题