2010-08-13 83 views
10

假設我有一個數據幀,其中有列c1,...,cn和一個函數f,它將這個數據幀的列作爲參數。 如何將f應用於數據幀的每一行以獲取新的數據幀?映射整個數據幀的行

例如,

x = data.frame(letter=c('a','b','c'), number=c(1,2,3)) 
# x is 
# letter | number 
#  a | 1 
#  b | 2 
#  c | 3 

f = function(letter, number) { paste(letter, number, sep='') } 

# desired output is 
# a1 
# b2 
# c3 

我該怎麼辦呢?我猜這是沿着{s,l,t} apply(x,f)的路線,但我無法弄清楚。

+1

那麼到底有沒有直接的方法來映射行?我無法相信它 – nicolas 2012-10-06 17:31:34

回答

11

as @greg指出,paste()可以做到這一點。我懷疑你的例子是一個更普遍問題的簡化。在過去掙扎之後,as illustrated in this previous question,我結束了對這種類型的事情使用plyr包。 plyr做更多的事情,但這些東西很容易:

> require(plyr) 
> adply(x, 1, function(x) f(x$letter, x$number)) 
    X1 V1 
1 1 a1 
2 2 b2 
3 3 c3 

你要重命名的輸出列,我敢肯定,

所以,當我在輸入這個,@joshua顯示替代方法使用ddply。我的例子中的區別是adply將輸入數據幀視爲數組。 adply不使用@joshua創建的「group by」變量row。他是如何做到這一點的,直到哈德利把我引向adply()的方法。在上述問題中。

+0

感謝您將我指向'adply'(通過哈德利)。 ;-) – 2010-08-13 22:55:41

+1

你可以用'transform'或'summarize'來簡化它: – JoFrhwld 2010-08-13 23:12:51

+0

真棒,謝謝!是的,我的例子只是一個玩具的例子。我剛纔看了plyr +重塑,並沒有明白它=(但是我一定要再看看一次 – Brett 2010-08-15 22:59:51

6
paste(x$letter, x$number, sep = "") 
+0

這是我會做到的!這幾乎就像我們一直受到同一位R大師的指導;-) – Vince 2010-08-14 01:59:49

1

我想自己所想的這樣的事情,但要注意的是,apply家庭的函數不返回data.frames。他們也會嘗試在應用函數之前將數據幀強制轉換爲矩陣。

apply(x,1,function(x) paste(x,collapse="")) 

因此,您可能對plyr包中的ddply更感興趣。

> x$row <- 1:NROW(x) 
> ddply(x, "row", function(df) paste(df[[1]],df[[2]],sep="")) 
    row V1 
1 1 a1 
2 2 b2 
3 3 c3