2016-11-04 2 views
-1

Мне нужно представлять сгруппированные данные с различными столбцами в одной строке. например:Представление данных в одной строке для каждой группы в R

Dataset

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

Самый простой вариант будет split «Action_Number» на «ID» в list из 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 доступен в версии de 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 Спасибо за комментарий. Вы также можете проверить [здесь] (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

Использование 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> 
Смежные вопросы