【问题标题】:To count how many times one row is equal to a value计算一行等于一个值的次数
【发布时间】:2019-12-03 15:54:31
【问题描述】:

计算一行等于一个值的次数

  1. 我这里有一个 df:
    df <- data.frame('v1'=c(1,2,3,4,5),
                 'v2'=c(1,2,1,1,2),
                 'v3'=c(NA,2,1,4,'1'),
                 'v4'=c(1,2,3,NaN,5),                
                 'logical'=c(1,2,3,4,5))
  1. 我想知道有多少次一行等于带有新变量“count”的变量“logical”的值 我写了一个这样的 for 循环:
    attach(df)
    df$count <- 0
    for(i in colnames(v1:v4)){
        if(df$logical == i){
        df$count <- df$count+1} 
       }

但它不起作用。新变量“count”中仍然全为 0。 请帮忙解决。

完美的结果应该是这样的:

    df <- data.frame('v1'=c(1,2,3,4,5),
                 'v2'=c(1,2,1,1,2),
                 'v3'=c(NA,2,1,4,'1'),
                 'v4'=c(1,2,3,NaN,5),                
                 'logical'=c(1,2,3,4,5),
                 'count'=c(3,4,2,2,2))

非常感谢初学者。

【问题讨论】:

  • 与问题没有直接关系,但我强烈建议您避免使用attach() 函数。如果您每次都使用df$,则在这种情况下根本不需要它。
  • 我猜if 部分在for 循环中不正确。可以是ifelseifelse(df$logical == df[[i]], ..

标签: r count compare


【解决方案1】:

我们可以在创建逻辑matrix后使用rowSums

df$count <- rowSums(df[1:4] == df$logical,  na.rm = TRUE)
df$count
#[1] 3 4 2 2 2

【讨论】:

  • 非常感谢!但我会以一种优雅的方式将此结果附加到 df 上。如果有进一步的答案,我将不胜感激。
  • @sylvia 如果您指的是attach 函数,请不要使用它
  • @sylvia 你的意思是像df &lt;- within(df, {count &lt;- rowSums(df[1:4] == logical, na.rm = TRUE)})吗?
【解决方案2】:

我个人认为到目前为止@akrun 的解决方案是一种优雅且也是添加count 列的最佳有效方式。

另一种方式(我不知道这是否是您正在寻找“优雅”的方式)您可以用来将count 列“附加”到df 的末尾可能正在使用@ 987654325@,即,

df <- within(df, count <- rowSums(df[1:4]==logical,na.rm = T))

这样你会得到

> df
  v1 v2   v3  v4 logical count
1  1  1 <NA>   1       1     3
2  2  2    2   2       2     4
3  3  1    1   3       3     2
4  4  1    4 NaN       4     2
5  5  2    1   5       5     2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    相关资源
    最近更新 更多