如何根据R中另一个数据帧中的值保留数据框中的值

时间:2018-04-17 08:55:07

标签: r dataframe data-manipulation

我有一个数据帧(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然后我可以过滤掉但这不起作用..我意识到可能有一个比这更好的方法但我无法解决它。

谢谢

2 个答案:

答案 0 :(得分:1)

这是你想要的吗?

df <- merge(dt, dt2, by.x = "refanimal", by.y = "animal")
subset(df, studyday <= lastday) 
  • merge执行联接,将lastday的信息传递给第一个数据帧。调用结果df
  • subsetbase 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