R中不同列上的不同值的总和

时间:2017-10-07 15:39:57

标签: r dataframe

假设我在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个属性中的第一行中有7次A,6次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

或更糟糕的是,如果&#34; A&#34;我得到错误的n个属性中甚至没有一次

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

这里有什么可能的解决方案?

1 个答案:

答案 0 :(得分:2)

您可以使用lapply rowSums来快速完成此操作。我只使用三个“属性”生成了一些假数据。

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