我有两个数据框,我想对 df2 中的特定行进行子集化。这是 df1 和 df2:
df1:
Sdate columnA D
2020-05-14 DD 1
2020-05-14 FF 5
2020-05-14 EE 6
2020-05-14 GG 7
df2:
Sdate ColA C
2020-04-13 NN 1
2020-04-13 XX 1
2020-04-14 VV 5
2020-04-15 DD 6
2020-04-16 AA 7
以下是获得最终输出的步骤:
"2020-05-14" - "2020-04-13" 是 31。因此,我的 df2 最终输出应该是
Sdate ColA C
2020-04-14 VV 5
2020-04-15 DD 6
2020-04-16 AA 7
我尝试使用以下代码:
df2 <- ifelse(as.numeric(as.Date(as.character(df1[1,1]), format="%Y-%m-%d")-
as.Date(as.character(df2[1,1]), format="%Y-%m-%d"))>10,
subset(df2, Sdate!= df2[1,1]),print("Pass"))
我分三部分分别测试了这段代码,它们运行良好。但它不在上面的组合代码中。 df2 只是随代码一起消失了。
我应该改变什么才能得到我想要的?
答案 0 :(得分:1)
您可以为此使用 dplyr。我提供了一种方法,您不需要比较第一行,而只需取最小值即可。
library(dplyr)
new_df <- df2 %>%
mutate(
isOldest = Sdate == min(Sdate),
deleteOldest = as.integer(min(df1$Sdate) - min(Sdate)) > 10
) %>%
filter(!(isOldest & deleteOldest))
如果您实际上只需要比较第一行:
new_df <- df2 %>%
mutate(
isOldest = Sdate == df2$Sdate[1],
deleteOldest = as.integer(df1$Sdate[1] - df2$Sdate[1]) > 10
) %>%
filter(!(isOldest & deleteOldest))
希望这是您所需要的。下面的数据框。
df1 <- data.frame(
Sdate = as.Date('2020-05-14'),
columnA = c('DD', 'FF', 'EE', 'GG'),
D = c(1, 5, 6, 7),
stringsAsFactors = FALSE
)
df2 <- data.frame(
Sdate = as.Date(c(rep('2020-04-13', 2), '2020-04-14', '2020-04-15',' 2020-04-16')),
colA = c('NN', 'XX', 'VV', 'DD', 'AA'),
C = c(1, 1, 5, 6, 7),
stringsAsFactors = FALSE
)