繁体   English   中英

如何基于R中另一个数据帧中的值将数据帧中的值保留

[英]How to keep values in a dataframe based on values in another dataframe in R

我有一个数据框(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 <= dt2 $ last 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's和NAs,然后可以将其过滤掉,但这是行不通的。.我意识到可能有比这更好的方法,但我无法解决。

谢谢

这是你想要的吗?

df <- merge(dt, dt2, by.x = "refanimal", by.y = "animal")
subset(df, studyday <= lastday) 
  • merge进行lastday ,将最后lastday的信息带到第一个数据帧。 将结果称为df
  • subsetbase R中的有用函数,用于过滤(和选择列)数据。 在这种情况下,您需要合并的df所有行,其中studyday <= lastday

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM