【问题标题】:Total rows does not contain a factor and the value is not zero总行数不包含因子且值不为零
【发布时间】:2016-11-12 01:39:39
【问题描述】:

我有以下数据

    path     value
1 b,b,a,c     3
2     c,b     2
3       a    10
4 b,c,a,b     0
5     e,f     0
6     a,f     1

df

df <- data.frame (path= c("b,b,a,c", "c,b", "a", "b,c,a,b" ,"e,f" ,"a,f"), value = c(3,2,10,0,0,1))

我希望计算我有一个因子并且值为零的总数。所以我想要的输出是:

 #desiored output
    path value
1:    b     2
2:    a     1
3:    c     2
4:    e     4
5:    f     3

例如,对于a,它显示我们没有a且值不为零的总数等于1。在第2行中只有一次我们没有a并且值不为零。 (希望清楚,如果需要更多示例,请告诉我)

我尝试了以下代码,但 b 的输出错误。有谁知道为什么?

total <- sum(df$value != 0)

library (splitstackshape)

#total number of total minus total number that a value is not zero 

output <-cSplit(df, "path", ",", 'long')[, .(value=total - sum(value!=0)), .(path)]

output

此代码导致以下输出对于b 不正确

path value
1:    b     1
2:    a     1
3:    c     2
4:    e     4
5:    f     3

【问题讨论】:

    标签: r splitstackshape


    【解决方案1】:

    将因子读入facs,然后使用 grep 将它们取出并计数:

    facs <- unique(scan(textConnection(as.character(df$path)), what = "", sep = ","))
    data.frame(path = facs, 
               value = colSums( !sapply(facs, grepl, as.character(df$path)) & df$value != 0 ))
    

    给予:

      path value
    b    b     2
    a    a     1
    c    c     2
    e    e     4
    f    f     3
    

    【讨论】:

    • 谢谢@G。格洛腾迪克是正确的,但是,这似乎不是最有效的方法,而且速度太慢。你知道我的代码有什么问题吗?
    • 我的意思是你的是正确的,但我发布这个问题是希望有人告诉我我的代码有什么问题,而不是提供解决方案。顺便说一句,我感谢您解决这个问题的好主意并接受它。
    • 问题中的代码没有跟踪长数据表中每一行来自的原始行,所以它不可能是正确的。
    猜你喜欢
    • 2021-11-19
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多