2014-02-10 82 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) 

現在我想有一個新的數據框列表B中的所有值在小區這樣

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

任何人都可以點我在正確的方向?我一直在尋找的最大ddply有一列(B),另一個是分(B),然後列粘貼在一起,但它給我的錯誤:

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(c $ b,c $ a,paste,collapse =',')' - 您不需要匿名函數,因爲您可以傳遞'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