【问题标题】:How to keep values in a dataframe based on values in another dataframe in R如何根据R中另一个数据框中的值将值保留在数据框中
【发布时间】:2018-04-17 08:55:07
【问题描述】:

我有一个如下的数据框(dt)

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

和第二个数据帧(dt2)如下

animal    lastday
b1          5
b2          3
b3          4
b4          3

我想通过 dt 并只保留 dt$refanimal = dt2$animal & dt$study day

即

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

我觉得它应该很简单,但我无法解决。

我尝试过如下循环

for (i in 1:nrow(dt)){
check = dt[i,]

  for (j in 1:nrow(dt2)){
    check2 = dt2[j,]
    if(check$refanimal == check2$animal & check$studyday <= 
check2$lastday){
dt$tmp == 1
    } else {
dt$tmp == "NA"
  }

希望我能在原始 dt 中获得另一列 1 和 NA,然后我可以过滤掉,但这不起作用。我意识到可能有比这更好的方法,但我就是做不到解决它。

谢谢

【问题讨论】:

    标签: r dataframe data-manipulation


    【解决方案1】:

    这是你想要的吗?

    df <- merge(dt, dt2, by.x = "refanimal", by.y = "animal")
    subset(df, studyday <= lastday) 
    
    • merge 进行连接,将lastday 的信息带到第一个数据帧。调用结果df。
    • subset 是base R 中用于过滤(和选择列)数据的有用功能。在这种情况下,您希望合并 df 的所有行,其中 studyday &lt;= lastday。

    【讨论】:

      【解决方案2】:

      这是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
      

      【讨论】:

        猜你喜欢
        • 2021-11-22
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多