如何在满足条件的情况下基于较大的 Dataframe 列在 Dataframe 中创建新列[duplicate]

g6ll5ycj  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(109)
    • 此问题在此处已有答案**:

(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.

我已经做了一些调查,我知道这里的错误。但是,我找不到任何解决我的问题。

esbemjvw

esbemjvw1#

第一个 Dataframe :

df1 <- x %>% 
  left_join(y, by = c("ID", "Case_ID")) %>% 
  select(-To)

第二个 Dataframe :

df2 <- df1 %>% 
  mutate(
    From2 = as.Date(ifelse(From < Date, From, NA), origin = "1970-01-01")
  )

zephryl 指出的方法相同,只是没有过滤df2。

相关问题