2015-04-09 4 views
2

Я по-прежнему новичок в R и нуждаюсь в некоторой помощи по следующей проблеме. У меня есть да dataframe, который выглядит smiliar к этому (но путь более сложный)Значения групп в том же столбце в R

Token1 A B E 
Token2 A F D G 
Token3 C F E 
Token4 B A F 

То, что я хочу, группирует каждое уникальное значение, которое появляется в одной строке, так что один столбец содержит только значение, если верно для строки и NA, если нет, то как это:

Token1 A B NA NA E NA NA 
Token2 A NA NA D NA F G 
Token3 NA NA C NA E F NA 
Token4 A B NA NA NA F NA 

Я не нашел ничего полезного до сих пор ... как мне добраться до указанного выше результата?

Заранее благодарен!

Edit:

Спасибо всем, но фактический DF является гораздо более сложным и содержит несколько тысяч возможных значений во всех столбцах (я использовал A, B, C и т.д., чтобы упростить задачу), так решения, похоже, не сработают ... Как их группировать (я знаю, что будет много отдельных столбцов)?

+2

Я думаю, что в этом случае действительно важно, как выглядит ваш набор данных. Можете ли вы 'dput'it? – rmuc8

+0

Я попытался использовать dput(), но даже для только n = 1, выход HUGE (для данных есть около 250 столбцов, если это полезно) – Supersquirrel

+0

Используйте это: 'df <- data.frame (Token = c («Token1», «Token2», «Token3», «Token4»), Col1 = c («A», «A», «C», «B»), Col2 = c («B», «F "," F "," A "), Col3 = c (" E "," D "," E "," F "), Col4 = c (" "," G "," "," ").) ' –

ответ

1

Вы можете попробовать:

cols = unique(unlist(df[-1])) 
cols = as.vector(sort(cols[!is.na(cols)])) 

cbind(as.vector(df[,1]), 
     t(apply(df[-1], 1, function(u) ifelse(cols %in% u[!is.na(u)], cols, NA)))) 
# [,1] [,2]  [,3]  [,4]  [,5]  [,6]  [,7]   [,8]  
#1 "cat" NA  "dog.01" NA  NA   NA  NA   NA   
#2 "bird" "cat.01" NA  NA  "robin.01" NA  NA   "eagle.01" 
#3 "horse" NA  "dog.01" "pony.01" NA   NA  "unicorn.01" NA   
#4 "dog" "cat.01" NA  NA  "robin.01" "bird.01" NA   NA   
#5 ""  NA  NA  NA  NA   NA  NA   NA   

данных:

df=structure(list(Lemma = structure(c(3L, 2L, 5L, 4L, 1L), .Label = c("", "bird", "cat", "dog", "horse"), class = "factor"), Sim = structure(c(3L, 5L, 4L, 2L, 1L), .Label = c("", "cat.01", "dog.01", "pony.01", "robin.01"), class = "factor"), X = structure(c(1L, 3L, 4L, 2L, 1L), .Label = c("", "bird.01", "cat.01", "unicorn.01"), class = "factor"), X.1 = structure(c(1L, 3L, 2L, 4L, 1L), .Label = c("", "dog.01", "eagle.01", "robin.01"), class = "factor")), .Names = c("Lemma", "Sim", "X", "X.1"), row.names = c(NA, 5L), class = "data.frame") 
+0

Это отличное решение - очень незначительное дополнение следует рассмотреть следующие вопросы: добавить Cols = ЧИСЛО [порядка (перевалы)] перед оператором cbind - это поставит буквы в порядке –

+0

Done с 'sort';) –

+0

Спасибо, но это работает с образцом dataframe, но, к сожалению, не с оригиналом (очень большим), который я импортирую с read.csv2, есть ли способ его применения? – Supersquirrel

0

Вот еще одно решение для всех букв:

df <- data.frame(Token=c("Token1", "Token2", "Token3", "Token4"), 
     Col1=c("A", "A", "C", "B"), Col2=c("B", "F", "F", "A"), 
     Col3=c("E", "D", "E", "F"), Col4=c("", "G", "", "")) 

df2 <- data.frame(df[, 1], t(sapply(1:dim(df)[1], function(i){ 
    toupper(letters) %in% c(t(df[i, -1])) 
}))) 

names(df2) <- c("Token", toupper(letters)) 

for(i in 2:27){ 
    df2[, i][df2[, i]==T] <- names(df2)[i] 
    df2[, i][df2[, i]==F] <- NA 
} 

df2 
1

Я не уверен, почему вы бы хочу такую ​​структуру, но вы можете попробовать cSplit_e из моего "splitsta ckshape "после свертывания всех столбцов без маркера в одну строку.

Вот пример с образцовыми данными из ответа полковника Бовеля.

df2 <- cbind(df[1], New = do.call(paste, c(df[-1], sep = ","))) 
library(splitstackshape) 

cSplit_e(df2, "New", ",", mode = "value", type = "character", drop = TRUE) 
# Lemma New_ New_bird.01 New_cat.01 New_dog.01 New_eagle.01 New_pony.01 
# 1 cat    <NA>  <NA>  dog.01   <NA>  <NA> 
# 2 bird <NA>  <NA>  cat.01  <NA>  eagle.01  <NA> 
# 3 horse <NA>  <NA>  <NA>  dog.01   <NA>  pony.01 
# 4 dog <NA>  bird.01  cat.01  <NA>   <NA>  <NA> 
# 5     <NA>  <NA>  <NA>   <NA>  <NA> 
# New_robin.01 New_unicorn.01 
# 1   <NA>   <NA> 
# 2  robin.01   <NA> 
# 3   <NA>  unicorn.01 
# 4  robin.01   <NA> 
# 5   <NA>   <NA> 

Вам нужно просто отбросить столбец «New_», который возникает из-за наличия пустых столбцов.

Смежные вопросы