2013-08-29 44 views
50

我想用一個數據幀的應用功能,但只適用功能到最後5列()函數。r使用特定的數據幀列

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y, 2, A)}) 

這適用甲至y

B<- by(wifi,(wifi$Room),FUN=function(y){apply(y[4:9], 2, A)}) 

的所有列這適用甲僅列Y的4-9,而B的總返回剝掉該第一3列...我仍然想要那些,我只是不想讓A適用於他們。

wifi[,1:3]+B 

也不會做我期望/想要的。

+1

的「由」調用複雜這個問題。如果它是相關的,你應該重寫這個問題來澄清(什麼是wifi $房間?)。我在下面的回答中忽略了。 – leif

+0

你可以'cbind(Y [1:3],...)'的結果你得到。 –

回答

42

使用一個例子data.frame和示例功能(只需+1到所有值)

A <- function(x) x + 1 
wifi <- data.frame(replicate(9,1:4)) 
wifi 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 1 1 1 1 1 1 
#2 2 2 2 2 2 2 2 2 2 
#3 3 3 3 3 3 3 3 3 3 
#4 4 4 4 4 4 4 4 4 4 

data.frame(wifi[1:3], apply(wifi[4:9],2, A)) 
#or 
cbind(wifi[1:3], apply(wifi[4:9],2, A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 

甚至:

data.frame(wifi[1:3], lapply(wifi[4:9], A)) 
#or 
cbind(wifi[1:3], lapply(wifi[4:9], A)) 

# X1 X2 X3 X4 X5 X6 X7 X8 X9 
#1 1 1 1 2 2 2 2 2 2 
#2 2 2 2 3 3 3 3 3 3 
#3 3 3 3 4 4 4 4 4 4 
#4 4 4 4 5 5 5 5 5 5 
+0

有沒有辦法做到這一點使用'$'索引某列的名字,而不是使用'[:]'由列號索引?我嘗試添加colnames:'colnames(WIFI)= C( 「一」, 「B」, 「C」, 「d」, 「E」, 「F」, 「G」, 「H」, 「I」)'但任何嘗試使用lapply(wifi $ e,2,X)都沒有發生。 – skotturi

+5

@skotturi - 您可以像'wifi [c(「a」,「b」,「c」)]'這樣做來按名稱對多個列進行索引。 – thelatemail

47

lapply可能比apply一個更好的選擇在這裏,因爲申請第一強求你data.frame到一個數組,這意味着所有列必須具有相同的類型。根據您的情況,這可能會產生意想不到的後果。

的模式是:

df[cols] <- lapply(df[cols], FUN) 

在 'COLS' 載體可以是變量名或索引。我更喜歡儘可能使用名稱(它對列重新排序很有用)。所以你的情況,這可能是:

wifi[4:9] <- lapply(wifi[4:9], A) 

使用列名的例子:

wifi <- data.frame(A=1:4, B=runif(4), C=5:9) 
wifi[c("B", "C")] <- lapply(wifi[c("B", "C")], function(x) -1 * x) 
+2

小校正:無線網絡< - data.frame(A = 1:4,B = runif(4),C = 5:8) – jcfaria