R创建一个新列,该列的值取决于其他两个列的匹配情况

时间:2020-05-18 02:20:42

标签: r dplyr

我很难把我的问题写成单词(因此标题很奇怪),但是:

我想创建一个新的收入列,该列将采用与Price相匹配的DateLast trading day的值。像这样:

对于第一行,最后一个交易日为2014-02-17,因此我检查了“日期”列,在第五行中,“日期”等于2014-02-17。因此,我将第五行的价格定为235,并将其分配给所有以2014-02-17Last trading day的行。

   Price     Date       `Last trading day`           Earnings
  <dbl>     <date>       <date>                        <dbl>
    224. 2013-01-02   2014-02-17                      235
    224. 2013-01-02   2014-02-17                      235
    224. 2013-01-02   2014-02-17                      235
    224. 2013-01-02   2014-04-19                      260
    235. 2014-02-17   2014-04-19                      260
    260. 2014-04-19   2014-06-17                      253

我尝试了这个,但是没有用:

   library(dplyr)
   library(plyr)
   df<-data %>%
   group_by(`Last trading day`) %>%
   mutate(Earnings = if_else(data$Date==data$`Last trading day`, Price, NA_real_))

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我们可以使用match

df$Earnings <- df$Price[match(df$Last_trading_day, df$Date)]

dplyr管道中使用它:

library(dplyr)
df %>% mutate(Earnings = Price[match(Last_trading_day, Date)])

另一个选择是将数据框与其自身连接。

library(dplyr)
df %>% left_join(df, by = c('Last_trading_day' = 'Date'))

我用下划线将Last Trading day列名中的空格重命名。

答案 1 :(得分:1)

我们可以删除data$,因为它会破坏组属性而不是每个组中的值,从而占用整列

library(dplyr)
data %>%
   group_by(`Last trading day`) %>%
   mutate(Earnings = if_else(Date== `Last trading day`, Price, NA_real_))

或者另一个选择是case_when

data %>%
   group_by(`Last trading day`) %>%
   mutate(Earnings = case_when(Date== `Last trading day` ~ Price))

而且,由于我们正在逐元素进行比较,因此不需要任何group_by

data %>%      
   mutate(Earnings = if_else(Date== `Last trading day`, Price, NA_real_))

或者使用case_when删除group_by


以上解决方案基于所示的OP代码。如果我们需要根据两列进行替换

library(data.table)
setDT(df)[df, on = .(Last_trading_day =  Date)]
相关问题