我希望能够创建一个能够计算列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是不正确的。 我希望这是有道理的,我非常坚持这一点。谢谢!
答案 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)
),按“名称”进行分组,在.SDcols
,unlist
数据子集中指定感兴趣的列。 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
编码风格。如果您使用dplyr
和reshape2
包,则代码优雅且易于阅读:
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