我很难把我的问题写成单词(因此标题很奇怪),但是:
我想创建一个新的收入列,该列将采用与Price
相匹配的Date
中Last trading day
的值。像这样:
对于第一行,最后一个交易日为2014-02-17
,因此我检查了“日期”列,在第五行中,“日期”等于2014-02-17
。因此,我将第五行的价格定为235,并将其分配给所有以2014-02-17
为Last 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_))
非常感谢您的帮助。
答案 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)]