鉴于以下数据
data_min <- data.frame("cond"=c("a","b","c"),"min"=c(1,3,1))
data <- data.frame("cond"=c("a","b","b","a","c"),"val"=c(0,2,4,7,0))
我想从data
中选择所有行,因为val
中的值大于data_min
中为该条件指定的最小值。因此,在给定的示例中,我希望最终得到一个表
cond val
b 4
a 7
到目前为止,我已经尝试了
datanew <- data[which(data$cond==data_min$cond & data$val > data_min$min),]
给了我a 7
但不是b 4
。我有两个问题,(1)为什么我得到的结果,以及(2)我如何得到所需的结果?
答案 0 :(得分:4)
您需要使用match
,因为data.frames具有不同的行数:
data[data_min[match(data$cond, data_min$cond),]$min <= data$val,]
答案 1 :(得分:3)
您可以将两个数据框合并在一起,以简化操作:
> m=merge(data,data_min,by='cond')
> m[which(m$val > m$min), c('cond','val')]
cond val
2 a 7
4 b 4
答案 2 :(得分:0)
使用dplyr
的解决方案。我们可以先执行连接,然后在val
和min
列之间过滤条件。
library(dplyr)
data2 <- data %>%
left_join(data_min, by = "cond") %>%
filter(val > min) %>%
select(-min)
data2
cond val
1 b 4
2 a 7