【问题标题】:Conditionally sum dynamic columns in r有条件地对 r 中的动态列求和
【发布时间】:2019-12-17 14:52:37
【问题描述】:

我试图根据它们是否大于或小于 0 有条件地对许多列求和。我很惊讶我找不到 dplyrdata.table 解决这个问题。我想为大型 data.frame 计算 4 个新列(要计算的列在帖子的底部)。

dat2=matrix(nrow=10,rnorm(100));colnames(dat2)=paste0('V',rep(1:10))

dat2 %>% as.data.frame() %>%
  rowwise() %>%
  select_if(function(col){mean(col)>0}) %>%
  mutate(sum_pos=rowSums(.))  ##Obviously doesn't work

这些是我想要计算的简单统计数据(是的;这些 apply 语句有效,但我的 dplyr 链中还有其他事情要做,所以这就是我寻找dplyrdata.table 方式的原因.每个给定行的正负列是不同的,所以我无法获取列列表(必须按行动态完成)。

#Calculate these, but in a dplyr chain?
n_pos=apply(dat2,1,function(x) sum((x>0)))
n_neg=apply(dat2,1,function(x) sum((x<0)))
sum_pos=apply(dat2,1,function(x) sum(x[(x>0)]))
sum_neg=apply(dat2,1,function(x) sum(x[(x<0)]))

【问题讨论】:

  • rowSums(replace(dat2, dat2 &lt; 0, 0))

标签: r dplyr data.table


【解决方案1】:

我们不需要rowwiserowSums,因为rowSums 可以在没有任何分组的情况下求和

library(dplyr)
dat2 %>%
   as.data.frame() %>%  
   select_if(~ is.numeric(.) && mean(.) > 0) %>% 
   mutate(sum_pos = rowSums(.))

根据描述,似乎不是mean条件,而是与rowwise相关,正负值分别为sum

dat2 %>%
   as.data.frame %>%
   mutate(sum_pos = rowSums(. * NA^(. < 0), na.rm = TRUE),
           sum_neg = rowSums(.[1:10] * NA^(.[1:10] > 0), na.rm = TRUE) )

【讨论】:

  • 这与从apply获得的sum_pos向量不匹配
  • @K.J.J.K 在apply 中,您没有使用mean 条件,这是一个不同的条件。你在找哪一个?
  • 我的策略围绕着尝试取 1 列的平均值来使用 select_if(因此,为什么我在 select_if 语句中使用 mean)
  • @K.J.J.K 现在,它应该与apply 解决方案一起使用
  • 在英语中,如果. 大于或小于0,您的语句是否乘以NA,然后将该向量(充满数字和NA)传递给rowSums?
猜你喜欢
  • 2022-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
相关资源
最近更新 更多