[英]How to change values in a dataframe based on another dataframe in 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
。 subset
是base
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.