Chciałbym zmutować ramkę danych, stosując funkcję, która wywołuje inną ramkę danych. Potrafię to osiągnąć na kilka różnych sposobów, ale chciałbym wiedzieć, jak to zrobić "właściwie".dplyr mutate wywoływanie innej ramki danych
Oto przykład tego, co próbuję zrobić. Mam ramkę danych z pewnymi czasami rozpoczęcia, a drugą z pewnymi obserwacjami w czasie. Chciałbym zwrócić ramkę danych z czasem rozpoczęcia i liczbą obserwacji, które pojawią się w pewnym oknie po czasie rozpoczęcia. na przykład
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)))
Najlepszym mam tak daleko z dplyr jest następujące (ale to traci zmiennych tożsamości):
df1 %>%
rowwise() %>%
do(count = filter(df2, time>.$start_time, time < (.$start_time + 15))) %>%
mutate(n=nrow(count))
wyjściowa:
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
Spodziewałem się w stanie to zrobić:
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))))
, ale to zwraca błąd:
Error: comparison (6) is possible only for atomic and list types
Jaki jest sposób na zrobienie tego?
Działa to również, jeśli użyjemy 'mutate' zamiast" streszczenia ", a zaletą jest to, że jeśli istnieją dodatkowe zmienne do grupy przez vary, nie są one pomijane – kungfujam
@kungfujam: Tak, ale jeśli istnieje są więcej niż jednym 'start_time' na' id', wtedy musimy użyć funkcji 'rowwise' zamiast' group_by (id) '. Zobacz moją edycję. – aichao
To prawda, dziękuję. – kungfujam