【问题标题】:How to count every time values in two columns are both NOT NA?每次两列中的值都不是 NA 时,如何计算?
【发布时间】:2014-10-31 15:56:50
【问题描述】:

假设我正在处理来自足球运动员的数据。我有球员的名字,他们参加过的国家,以及他们在这些国家打进了多少球。

  players England USA Brazil
1     ben       0   3    NA
2    josh       3   0     2
3    mike       3   0     4
4     sam       0   3     3
5    luis      NA   1    NA
6    john       1   NA    1
7    javi       NA  NA    3
8   terry       1   1     NA

我想比较每一对列。所以我在这里想要的是三个数字:英国,美国列连续有两个数字的次数(这里是 5),美国,巴西连续有两个数字的次数(这里是 3 ),以及英格兰、巴西列中出现两个数字的次数(此处为 4)。

  • 在评论让我意识到只用两列发布问题后,我编辑了问题。

【问题讨论】:

  • @goldisfine 你想比较每一对列吗?
  • 是的,如果不清楚,很抱歉,@akrun
  • 当他们完全改变问题而没有通知回答者时,我通常会投反对票。但现在是星期五和万圣节 :)
  • 通知答案以便他们看到的最佳方式是什么?感谢您不投反对票。

标签: r


【解决方案1】:

你也可以使用

sum(!rowSums(is.na(df[,-1])))
#[1] 5

更新

基于新数据集

 indx <- combn(colnames(df)[-1],2)
 res <- sapply(split(indx, col(indx)), function(x) 
                          sum(!rowSums(is.na(df[,x]))))

 names(res) <- apply(indx,2, paste, collapse="_")
 res
 # England_USA England_Brazil     USA_Brazil 
 #        5              4              3 

更短的代码(如@Ananda Mahto 建议的那样)是:

 unlist(combn(df[-1], 2, function(x) 
            setNames(sum(complete.cases(x)), 
            paste(names(x), collapse = "-")), simplify = FALSE))

# England-USA England-Brazil     USA-Brazil 
#         5              4              3 

【讨论】:

  • 我要发帖unlist(combn(mydf[-1], 2, function(x) setNames(sum(complete.cases(x)), paste(names(x), collapse = "-")), simplify = FALSE))
  • @Ananda Mahto 看起来更好。
【解决方案2】:

将 is.na 与 and 一起使用...

txt<-'players England USA
1     ben       0   3
2    josh       3   0
3    mike       3   0
4     sam       0   3
5    luis      NA   1
6    john       1   NA
7    javi       NA  NA
8   terry       1   1 '

df<-read.table(text=txt)

bothNArows <- which(is.na(df$England) & is.na(df$USA))
(nbad<-length(bothNArows))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2019-08-04
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多