2014-02-10 4 views
0

Я думаю, что у меня относительно простая проблема, но не могу понять, как ее решить. У меня есть следующий кадр данных:Перечислить значения одного столбца другим

a <- c("A","B","C","C","D","D","E") 
b <- c(1,2,3,4,5,6,7) 
c <- data.frame(a,b) 

Теперь я хочу, чтобы новый dataframe перечислены все значения Ь в в ячейке, как это

A;1 
B;2 
c;3,4 
D;5,6 
E;7 

Может кто-нибудь мне точку в правильном направлении? Я смотрел на ddply с одной колонкой для макс (б), а другой для мин (б), а затем вставить столбцы вместе, но это дает мне ошибку:

Error in .fun(piece, ...) : argument is missing, with no default 

ответ

1

Использование plyr:

ddply(c, .(a), summarise, bs=list(b)) 

Теперь ваш результирующий data.frame имеет столбец bs, каждый из которых является списком.

FWIW, может быть информативным узнать, почему вы хотите структурировать свои данные таким образом. Обычно R имеет средства, которые позволяют избежать этого типа операции и сделать более чистым и более понятным кодом ...

3

с использованием tapply:

tapply(c$b, c$a, function(x) paste(x, collapse =',')) 
# A  B  C  D  E 
# "1" "2" "3,4" "5,6" "7" 
+1

+1 Можно упростить, что 'tapply (с $ Ь, с $ а, пасты, коллапс =«») '- вам не нужно анонимную функцию здесь, как вы можете передать' collapse' через аргумент '...' 'tapply'. –

3

Это может быть сделано просто с помощью split() в базе R. Используя ваши данные в кадре данных df

df <- data.frame(a = c("A","B","C","C","D","D","E"), b = c(1,2,3,4,5,6,7)) 

решение вы хотите with(df, split(b, a))

R> with(df, split(b, a)) 
$A 
[1] 1 

$B 
[1] 2 

$C 
[1] 3 4 

$D 
[1] 5 6 

$E 
[1] 7 

Теперь это список, и вам нужен кадр данных, но это невозможно без какой-либо конкатенации информации, поскольку каждый элемент в кадре данных должен иметь одинаковую длину. Если вы хотите, чтобы в качестве вектора, просто paste() элементы вместе:

sapply(with(df, split(b, a)), paste, collapse = ",") 

R> sapply(with(df, split(b, a)), paste, collapse = ",") 
    A  B  C  D  E 
    "1" "2" "3,4" "5,6" "7" 
0

ли вы хотите в письмах, а также уникальные элементы, которые будут включены в ряды новой data.frame?

v <- tapply(b,a, unique) 
data.frame(new_df = unlist(lapply(seq_along(v), 
      function(i) paste(names(v)[[i]], paste(v[[i]], collapse = ","), sep = ";")))) 

# new_df 
#1 A;1 
#2 B;2 
#3 C;3,4 
#4 D;5,6 
#5 E;7 
Смежные вопросы