2017-10-07 42 views
1

比方說,我有以下數據形式的數據幀在R:總和R經由不同的列不同的值

Property 1 | Property 2 | ... | Property n 
    A   B     R 
    C   A     S 
    D   F     C 
    .   .     . 
    .   .     . 
    .   .     . 
    R   Z     X 

每個在任一單元格的n個屬性可以承擔任何字母A的到Z.現在,我想要計算每行中出現在該行中的26個字母中的任何一個的次數,並在屬性n旁邊的新列中給出該數字。因此,例如,n個屬性中的第一行中有七次A,六次B,0次C等與代碼給我下表

Property 1 | Property 2 | ... | Property n | A | B | C | ... | Z 
    A   B     R   7 6 0 | ... | 2 
    C   A     S  
    D   F     C 
    .   .     . 
    .   .     . 
    .   .     . 
    R   Z     X 

是否有R中的功能那是嗎?儘管很慢的我以爲我可以寫在信中的每一個和一些循環和排在

x <- vector(length=nrow(tr)) 
for (i in 1:nrow(tr)) { 
x[i] <- count(tr[i,], vars="A") 
} 

的形式,但後來我得到的錯誤

Error in unique.default(x) : 
unique() can only be applied to vectors 

或更糟的是,如果「A」是一次也沒有n個屬性中我得到的錯誤

Error in eval(expr, envir, enclos) : object 'A' not found 

什麼是這裏一個可能的解決方案?

回答

2

您可以使用lapplyrowSums來快速完成此操作。我只使用三個「屬性」生成了一些假數據。

set.seed(1) 
df <- data.frame(Property1 = sample(LETTERS, 6), Property2 = sample(LETTERS, 6), Property3 = sample(LETTERS, 6)) 

df[,LETTERS] <- lapply(LETTERS, function(x) rowSums(df==x)) 

結果的一個片段是這樣的:

df[,c(1:6)] 
    Property1 Property2 Property3 A B C 
1   J   G   M 0 0 0 
2   T   J   O 0 0 0 
3   W   A   L 1 0 0 
4   E   I   E 0 0 0 
5   O   T   S 0 0 0 
6   C   H   Y 0 0 1 
+0

我知道必須有東西做,很容易。謝謝!正如後續:當一般單詞而不是字母在單元格中時(例如「是」,「否」),是否可以通過TEST < - c(「是」,「否」)合併這些單詞並替換在LAPTERS中LETTERS(LETTERS,函數(x)rowSums(df == x))與TEST? – Taufi

+0

@Taufi,應該工作得很好!你可以看到它:'test < - c(「Yes」,「No」); (Property1 = sample(test,6,replace = T),Property2 = sample(test,6,replace = T),Property3 = sample(test,6,replace = T)); df [,test] < - lapply(test,function(x)rowSums(df == x))' –