r - r 基于条件向量的子集化

标签 r subset

这是对我之前措辞不当的问题的重述。 (对于那些回复它的人,我感谢您的努力,并且我很抱歉我的问题没有像我应该的那样清楚。)我有一个很大的数据集,其中的一个子集可能如下所示:

a<-c(1,2,3,4,5,1)
b<-c("a","b","a","b","c","a")
c<-c("m","f","f","m","m","f")
d<-1:6
e<-data.frame(a,b,c,d)

如果我想要根据特定条件计算第四列中的条目总和,我可以这样做:

attach(e)
total<-sum(e[which(a==3 & b=="a"),4])
detach(e)

但是,我有一个条件“向量”(称为条件向量),其前四个元素看起来更像是这样:

a==3 & b == "a"
a==2
a==1 & b=="a" & c=="m"
c=="f"

我想创建上面“总计”公式的“通用”版本,通过读取条件的条件向量来生成总计的结果向量。在此示例中,results_vector 中的前四个条目在概念上计算如下:

results_vector[1]<-sum(e[which(a==3 & b=="a"),4])
results_vector[2]<-sum(e[which(a==2),4])
results_vector[3]<-sum(e[which(a==1 & b=="a" & c=="m"),4])
results_vector[4]<-sum(e[which(c=="f"),4])

我的实际数据集有超过 20 个变量。因此,condition_vector 中的每个记录可以包含 1 到 20 多个条件(而不是本示例中使用的 1 到 3 个条件)。

除了使用 parse(eval(text= ... 方法,在相对较小的数据集上运行需要很长时间)之外,还有其他方法可以实现此目的吗?

提前感谢您提供的任何帮助(再次,我很抱歉我上次没有说清楚)。

Spark

最佳答案

这里使用使用 eval(parse(text=..) 的解决方案,即使您显然发现它很慢:

cond <- c('a==3 & b == "a"','a==2','a==1 & b=="a" & c=="x"','c=="f"')
names(cond) <- cond
results_vector <- lapply(cond,function(x)
                              sum(dat[eval(parse(text=x)),"d"]))

$`a==3 & b == "a"`
[1] 3

$`a==2`
[1] 2

$`a==1 & b=="a" & c=="m"`
[1] 1

$`c=="f"`
[1] 11

命名条件向量的优点是可以按条件访问结果。

results_vector[cond[2]]
 $`a==2`
  [1] 2

关于r - r 基于条件向量的子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19330917/

相关文章:

r - 在字母前加一个点

python - 查找满足特定约束的子集

R 安装包 RevoScaleR

r - 基于日期比较的子集数据集R

python - 如何从子集列表中过滤出唯一的组合

r - cbind 包含列表的列,维护列表的列

arrays - mongodb - 检索数组子集

r - ggplot 饼图中的标签错误

r - 内部连接完全在一列上,而在另一列上模糊

重采样未产生主成分分析的预期结果