我想通過應用調用另一個數據幀的函數來變更數據幀。我可以通過幾種不同的方式實現這一點,但想知道如何「正確地」做到這一點。dplyr mutate調用另一個數據幀
這是我想要做的一個例子。我有一個數據框,有一些開始時間,另一個有一些時間觀察。我想返回一個包含開始時間的數據幀,以及在開始時間之後的某個窗口內發生的觀察次數。例如
set.seed(1337)
df1 <- data.frame(id=LETTERS[1:3], start_time=1:3*10)
df2 <- data.frame(time=runif(100)*100)
lapply(df1$start_time, function(s) sum(df2$time>s & df2$time<(s+15)))
我已經走到這一步,與dplyr最好的是以下(但丟失了身份變量):
df1 %>%
rowwise() %>%
do(count = filter(df2, time>.$start_time, time < (.$start_time + 15))) %>%
mutate(n=nrow(count))
輸出:
Source: local data frame [3 x 2]
Groups: <by row>
# A tibble: 3 × 2
count n
<list> <int>
1 <data.frame [17 × 1]> 17
2 <data.frame [18 × 1]> 18
3 <data.frame [10 × 1]> 10
我期待的是能夠做到這一點:
df1 <- data.frame(id=LETTERS[1:3], start_time=1:3*10)
df2 <- data.frame(time=runif(100)*100)
df1 %>%
group_by(id) %>%
mutate(count = nrow(filter(df2, time>start_time, time<(start_time+15))))
但是這返回錯誤:
Error: comparison (6) is possible only for atomic and list types
這是幹什麼的dplyr方式?
這也適用,如果我們使用'mutate'來代替'summarise',這樣做的好處是,如果組中有額外變量由變量賦值,它們不會被丟棄 – kungfujam
@kungfujam:是的,但如果有我們需要使用'rowwise'函數來代替'group_by(id)'。請參閱我的編輯。 – aichao
非常真實,謝謝。 – kungfujam