在R语言中基于两列条件填充数据框列值的问题求助
按组把最新日期对应的Value填到Label列的解决办法
先给你捋清楚之前两种方法的问题,再给你靠谱的实现:
关于你用的ave函数
你原来的代码错在取value的时候拿了组内第一个值,不是最新日期对应的那个值。修正后应该是这样:
如果只是把组内最新日期那一行的Label换成对应Value:
df$label <- ave(seq_len(nrow(df)), df$group, FUN = function(i) { # 找到组里日期最新的行位置 latest_row <- which.max(df$date[i]) # 把这行的Label换成对应的Value,其他行保持原样 replace(df$label[i], latest_row, df$value[i][latest_row]) })
如果要把组内所有行的Label都设为最新日期对应的Value:
df$label <- ave(df$value, df$group, FUN = function(vals) { # 先找到组里最新日期对应的Value latest_val <- vals[which.max(df$date[seq_along(vals)])] # 组里每一行都填这个值 rep(latest_val, length(vals)) })
关于你用的dplyr方法
你遇到的n()错误,大概率是你原始数据的label列里有调用n()的代码,或者是dplyr版本的小问题。换个更直观的写法就好:
仅替换组内最新日期行的Label:
library(dplyr) df <- df |> group_by(group) |> mutate(label = if_else(date == max(date), value, label)) |> ungroup()
这里直接用date == max(date)判断,比用行号靠谱,避免排序出问题。
组内所有行的Label都设为最新日期的Value:
如果你的dplyr版本在1.1.0以上,可以用.by参数简化:
df <- df |> mutate(label = value[which.max(date)], .by = group)
版本旧的话就用group_by:
df <- df |> group_by(group) |> mutate(label = value[which.max(date)]) |> ungroup()
拿模拟数据测试下
比如你有这样的测试数据:
df <- data.frame( group = c("A", "A", "B", "B"), date = as.Date(c("2023-01-01", "2023-01-03", "2023-02-01", "2023-02-05")), value = c(10, 20, 30, 40), label = c(NA, NA, NA, NA) )
用第二种场景的代码跑了之后,结果会是:
group date value label 1 A 2023-01-01 10 20 2 A 2023-01-03 20 20 3 B 2023-02-01 30 40 4 B 2023-02-05 40 40
内容的提问来源于stack exchange,提问作者B.Shermeister
相关产品推荐
相关产品推荐

