- 此问题在此处已有答案**:
(13个答案)
2天前关闭。
假设我们面对两个不同大小的 Dataframe :
x = data.frame(c("6732", "2312", "3310", "0412", "0312"), c("3310", "0219", "0011", "3324", "3411"),
c("2019-06-01", "2013-01-01", "2019-03-01", "2018-02-01", "2018-01-01"))
colnames(x) = c("ID", "Case_ID", "Date")
x$Date <- as.Date(x$Date)
y = data.frame(c("1243", "6732", "1102", "0412", "2312", "3401", "1123", "3310"), c("0010", "3310", "0123", "3324", "0219", "3210", "0021", "1134"),
c("2014-06-01", "2015-01-01", "2016-01-01", "2015-03-01", "2014-01-01", "2014-01-01", "2014-06-01", "2013-01-01"),
c("2019-11-01", "2019-10-01", "2020-10-01", "2020-01-01", "2017-11-01", "2020-02-01", "2020-02-01", "2020-01-01"))
colnames(y) = c("ID", "Case_ID", "From", "To")
y$From <- as.Date(y$From)
y$To <- as.Date(y$To)
我现在想要在dataframe x中创建一个新列,如果满足某些条件,则该列基于dataframe y的"From"列。
我有两个不同的期望输出:
- 第一个**基于这样的条件,即相应"ID"和"Case_ID"的"From"条目被填入x中新列的正确行。如果ID或Case_ID不在y中,则相应条目应为NA,例如:
| 识别号|病例ID|日期|从|
| - ------|- ------|- ------|- ------|
| 小行星6732|小行星3310|2019年6月1日|2015年1月1日|
| 小行星2312|0219|2013年1月1日|2014年1月1日|
| 小行星3310|小零零一一|2019年3月1日|不适用|
| 0412|小行星3324|2018年2月1日|2015年3月1日|
| 0312|小行星3411|2018年1月1日|不适用|
对于第二个输出,我扩展了条件,使得除了前两个条件相同的"ID"和"Case-ID"之外,只有当y的"From"条目小于x中相应的"Date"时,才应采用y的"From"条目,例如:
| 识别号|病例ID|日期|从|
| - ------|- ------|- ------|- ------|
| 小行星6732|小行星3310|2019年6月1日|2015年1月1日|
| 小行星2312|0219|2013年1月1日|不适用|
| 小行星3310|小零零一一|2019年3月1日|不适用|
| 0412|小行星3324|2018年2月1日|2015年3月1日|
| 0312|小行星3411|2018年1月1日|不适用|
由于效率的原因(庞大的数据集),我想避免for循环,并希望用dplyr解决这个问题。
我在第一个案例中尝试的是:
library(dplyr)
z <- x %>%
mutate(from = ifelse(ID %in% y$ID & Case_ID %in% y$Case_ID , y$From, NA))
z$from <- as.Date(z$from, origin = "1970-01-01")
# using == instead of %in% leads to an error
但在本例中,我没有得到正确的"From"值,而是得到了以下内容:
| 识别号|病例ID|日期|从|
| - ------|- ------|- ------|- ------|
| 小行星6732|小行星3310|2019年6月1日|2014年6月1日|
| 小行星2312|0219|2013年1月1日|2015年1月1日|
| 小行星3310|小零零一一|2019年3月1日|不适用|
| 0412|小行星3324|2018年2月1日|2016年1月1日|
| 0312|小行星3411|2018年1月1日|不适用|
对于具有扩展条件的第二种情况,我得到以下错误:
library(dplyr)
z <- x %>%
mutate(from = ifelse(ID %in% y$ID & Case_ID %in% y$Case_ID & Date >= y$From, y$from, NA))
Error in `mutate()`:
i In argument: `from = ifelse(...)`.
Caused by error:
! `from` must be size 5 or 1, not 8.
我已经做了一些调查,我知道这里的错误。但是,我找不到任何解决我的问题。
1条答案
按热度按时间esbemjvw1#
第一个 Dataframe :
第二个 Dataframe :
与 zephryl 指出的方法相同,只是没有过滤df2。