计算R中来自多列的数据帧中的值的数量

时间:2017-01-19 13:47:39

标签: r counting

我希望能够创建一个能够计算列L2,L3和L4中值大于0的值的函数作为某个名称的函数。

Name    L1     L2     L3    L4
Carl    1       1     0     2
Carl    0       1     4     1 
Joe     3       0     3     1
Joe     2       2     1     0

例如,someFunction(Carl)= 5 和someFunction(Joe)= 4

我不想总结这些值,例如someFunction(Joe)= 7是不正确的。 我希望这是有道理的,我非常坚持这一点。谢谢!

3 个答案:

答案 0 :(得分:1)

或者如果你想要一个功能:

give_count <- function(dat,name) {
    sum(dat[dat$Name == name,3:ncol(dat)]!=0)
    }
give_count(data,"Joe")

答案 1 :(得分:0)

我们可以尝试使用data.table。将“data.frame”转换为“data.table”(setDT(df1)),按“名称”进行分组,在.SDcolsunlist数据子集中指定感兴趣的列。 table(.SD),检查它是否大于0,并获得逻辑向量的sum。这已分配(:=)以创建“N”列

library(data.table)
setDT(df1)[, N := sum(unlist(.SD)>0), Name, .SDcols = L2:L4]
df1
#   Name L1 L2 L3 L4 N
#1: Carl  1  1  0  2 5
#2: Carl  0  1  4  1 5
#3:  Joe  3  0  3  1 4
#4:  Joe  2  2  1  0 4

或另一种选择是

setDT(df1)[,  N := sum(unlist(lapply(.SD, `>`, 0))), Name, .SDcols = L2:L4]

或者我们可以在rowsum/rowSums

中使用base R组合
rowSums(rowsum(+(df1[3:5]>0), df1$Name))
#   Carl  Joe 
#   5    4 

如果我们只需要为特定的“姓名”

执行此操作
setDT(df1)[Name == "Carl"][, sum(unlist(.SD) > 0), .SDcols = L2:L4]

更新

如果我们需要汇总输出,请不要分配(:=

setDT(df1)[, .(N = sum(unlist(.SD)>0)), Name, .SDcols = L2:L4]
#   Name N
#1: Carl 5
#2:  Joe 4

答案 2 :(得分:0)

我鼓励使用tidyverse编码风格。如果您使用dplyrreshape2包,则代码优雅且易于阅读:

library(dplyr)
library(reshape2)
df1 %>% 
  select(-L1) %>% 
  melt(id=1,na.rm=T) %>% 
  group_by(Name) %>% 
  transmute(flag=value>0) %>% 
  summarize(sum(flag))


# A tibble: 2 × 2
    Name `sum(flag)`
  <fctr>       <int>
1   Carl           5
2    Joe           4