如何在满足前一行全为NA的条件下为DataFrame添加score列
R语言:按规则为DataFrame生成score列
原始数据
df = data.frame(x =c(letters[1:3],NA,NA,'part1',letters[4:5],NA,NA,'part2',letters[6:7]), y = c('p1','p2','p3',NA,NA,'---','p4','p5',NA,NA,'---','p6','p7') ) z = 5:6
需求说明
需要为上述DataFrame新增名为score的列,满足以下规则:
- 当
x列值为part1时,score赋值为5;x列值为part2时,score赋值为6 - 仅当
part所在行的前两行(当前行的前两个位置)的x和y列均为NA时,才赋予上述值,否则该行score仍为NA - 其余所有行的
score值为NA
解决方案
通过行索引匹配、条件判断实现,代码如下:
# 初始化score列为全NA df$score <- NA # 定位part1和part2的行索引 part1_idx <- which(df$x == 'part1') part2_idx <- which(df$x == 'part2') # 检查part1前两行是否全为NA,满足则赋值 if (all(is.na(df[part1_idx - 1, ])) && all(is.na(df[part1_idx - 2, ]))) { df$score[part1_idx] <- z[1] } # 检查part2前两行是否全为NA,满足则赋值 if (all(is.na(df[part2_idx - 1, ])) && all(is.na(df[part2_idx - 2, ]))) { df$score[part2_idx] <- z[2] }
运行后得到预期输出:
print(df) # x y score # 1 a p1 NA # 2 b p2 NA # 3 c p3 NA # 4 <NA> <NA> NA # 5 <NA> <NA> NA # 6 part1 --- 5 # 7 d p4 NA # 8 e p5 NA # 9 <NA> <NA> NA # 10 <NA> <NA> NA # 11 part2 --- 6 # 12 f p6 NA # 13 g p7 NA
逻辑说明
- 先初始化
score列为全NA,确保不符合条件的行默认值正确 - 用
which()定位part1和part2的行位置 - 分别验证两个位置的前两行是否满足全NA条件,符合则从向量
z中取出对应值赋值给score列
内容的提问来源于stack exchange,提问作者An116
相关产品推荐
相关产品推荐

