我有一个数据帧(dt)如下
<table>
{% for line in lines %}
<tr><td>{{ line.0 }}</td><td>{{ line.1 }}</td></tr>
{% endfor %}
</table>
和第二个数据帧(dt2)如下
companimal refanimal X studyday
b10 b1 2 1
b10 b1 9 2
b10 b1 4 3
b10 b1 4 4
b10 b1 11 5
b10 b2 1 1
b10 b2 1 2
b10 b2 20 3
b10 b2 12 4
b10 b2 16 5
b10 b3 9 1
b10 b3 2 2
b10 b3 17 3
b10 b3 22 4
b10 b3 1 5
b10 b4 13 1
b10 b4 17 2
b10 b4 9 3
b10 b4 7 4
b10 b4 19 5
我想通过dt并保留dt $ refanimal = dt2 $ animal&amp; dt $学习日&lt; = dt2 $最后一天
即。
animal lastday
b1 5
b2 3
b3 4
b4 3
我觉得它应该是直截了当但我无法解决。
我尝试过像下面这样的循环
companimal refanimal X studyday
b10 b1 2 1
b10 b1 9 2
b10 b1 4 3
b10 b1 4 4
b10 b1 11 5
b10 b2 1 1
b10 b2 1 2
b10 b2 20 3
b10 b3 9 1
b10 b3 2 2
b10 b3 17 3
b10 b3 22 4
b10 b4 13 1
b10 b4 17 2
b10 b4 9 3
希望我可以获得另一列1&amp;原来dt中的NAs然后我可以过滤掉但这不起作用..我意识到可能有一个比这更好的方法但我无法解决它。
谢谢
答案 0 :(得分:1)
这是你想要的吗?
df <- merge(dt, dt2, by.x = "refanimal", by.y = "animal")
subset(df, studyday <= lastday)
merge
执行联接,将lastday
的信息传递给第一个数据帧。调用结果df
。subset
是base
R中用于过滤(和选择列)数据的有用功能。在这种情况下,您希望合并df
的所有行studyday <= lastday
。答案 1 :(得分:0)
以下是tidyverse
,
library(tidyverse)
df2 %>%
group_by(animal) %>%
expand(lastday = seq(lastday)) %>%
rename(refanimal = animal, studyday = lastday) %>%
inner_join(df1)
给出,
#Joining, by = c("refanimal", "studyday") # A tibble: 15 x 4 # Groups: refanimal [?] refanimal studyday companimal X <fct> <int> <fct> <int> 1 b1 1 b10 2 2 b1 2 b10 9 3 b1 3 b10 4 4 b1 4 b10 4 5 b1 5 b10 11 6 b2 1 b10 1 7 b2 2 b10 1 8 b2 3 b10 20 9 b3 1 b10 9 10 b3 2 b10 2 11 b3 3 b10 17 12 b3 4 b10 22 13 b4 1 b10 13 14 b4 2 b10 17 15 b4 3 b10 9