我有一个看起来像这样的数据框:
P1 <- c('P1 -> (Normal,_)', 'P1 -> (Normal,_)', 'NA', 'P5 -> (UP,_)')
P2 <- c('P4 -> (UP,_)', 'NA', 'P2 -> (UP,_)', 'P4 -> (UP,_)')
P3 <- c('P2 -> (UP,_)', 'P3 -> (UP,_)', 'P1 -> (UP,_)', 'P2 -> (UP,_)')
P4 <- c('NA', 'P4 -> (UP,_)', 'P3 -> (UP,_)', 'P3 -> (UP,_)')
P5 <- c('P3 -> (UP,_)', 'NA', 'NA', 'NA')
df <- data.frame(P1, P2, P3, P4, P5)
我需要以 P1 列仅包含 P1 值、P2 列 - P2 值等的方式对其进行排序。如果该列没有值,则应包含“NA”。
最佳答案
使用 "NA"
而不是 NA
可能并不明智,但您可以在匹配 P1/2 后通过一些索引来做到这一点/3/4/5
词干带有变量名称:
sel <- df != "NA" ## use is.na(df) instead if data is actually NA
out <- replace(df, , "NA") ## use NA not "NA" if want an actual NA
out[ cbind(row(df)[sel], match(substr(df[sel],1,2), names(df)) ) ] <- df[sel]
out
# P1 P2 P3 P4 P5
#1 P1 -> (Normal,_) P2 -> (UP,_) P3 -> (UP,_) P4 -> (UP,_) NA
#2 P1 -> (Normal,_) NA P3 -> (UP,_) P4 -> (UP,_) NA
#3 P1 -> (UP,_) P2 -> (UP,_) P3 -> (UP,_) NA NA
#4 NA P2 -> (UP,_) P3 -> (UP,_) P4 -> (UP,_) P5 -> (UP,_)
关于r - 按列名称对数据框中的值进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69982267/