从多个列统计R中数据帧中的值数

从多个列统计R中数据帧中的值数,r,counting,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 我不想总结这些值,例

我希望能够创建一个函数,将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是不正确的。
我希望这是有道理的,我被困在这上面了。谢谢

我们可以尝试使用
data.table
。将“data.frame”转换为“data.table”(
setDT(df1)
),按“Name”分组,在
.SDcols
中指定感兴趣的列,
取消列出data.table的子集(
.SD
),检查它是否大于0,并获取逻辑向量的
和。这被分配(
:=
)以创建“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]

或者我们可以在
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]
更新 如果我们需要汇总输出,请不要分配(
:=


或者,如果您想拥有一个功能:

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

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

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
库(dplyr)
图书馆(E2)
df1%>%
选择(-L1)%>%
熔体(id=1,na.rm=T)%>%
分组单位(名称)%>%
转换(标志=值>0)%>%
汇总(总和(标志))
#一个tibble:2×2
名称`总和(标志)`
1卡尔5
2乔4

这样行吗
sum(df[df$Name=='Carl',-c(1,2)]>0)
也可以尝试
tapply(rowSums(df[,3:5]>0),df$Name,sum)
@Gopala谢谢,但我得到了这个错误:只在一个包含所有数字变量的数据帧上定义我不知道数据中的列类型<代码>str(df)
应该告诉你。@nicola+1。这是一个很好的解决方案,可以获得所有名称的结果。自从提到一个函数(名称)以来,我一直在关注一个函数。setDT是R中的函数吗?对不起,我是新来的@Amanda它是
data.table
中的一个函数,用于将“data.frame”转换为“data.table”。有一个
setDF
函数,正好相反。我非常喜欢你的建议。这给了我所有名字的计数,但是,你知道我如何为一个名字得到一个结果吗?我想创建一个函数,比如函数(Joe)=4谢谢。但是当我在我的数据框中使用它时,我得到的答案是NA。您的
data.frame
是否命名为
data
?如果不是,请根据
data.frame的名称更改函数中的第一个参数。如果数据中的列数超过5列,并且只需要计算三列,请将函数中的
ncol(dat)
更改为
5
。谢谢。由于某种原因,我仍然感到不安。实际上,我总共有14列,但我只想计算6:13列。您是否使用
str(your.data.frame)
检查了我们讨论的是整数值/数值?1:2列是整数,3:5列是“因子”,6:13列是整数。第14列是合乎逻辑的
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