2017-10-20 49 views
3

鑑於給出的以下數據ř通過在外部表

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對於指定的最小值大的所有行條件選擇行condidition。因此,在給定的例子,我期待着與一臺

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)我如何得到期望的結果?

回答

4

您需要使用match因爲data.frames有不同數量的列:使用dplyr

data[data_min[match(data$cond, data_min$cond),]$min <= data$val,]

+0

尼斯之一。在此之後會再試一次。 –

+0

偉大的作品!我會在明天結束這個問題,以便讓更多的人有機會做出迴應。非常感謝! –

0

一個解決方案。我們可以先執行一個連接,然後過濾valmin列之間的條件。

library(dplyr) 

data2 <- data %>% 
    left_join(data_min, by = "cond") %>% 
    filter(val > min) %>% 
    select(-min) 
data2 
    cond val 
1 b 4 
2 a 7 
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