r - 按列名称对数据框中的值进行排序

标签 r

我有一个看起来像这样的数据框:

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)

enter image description here

我需要以 P1 列仅包含 P1 值、P2 列 - P2 值等的方式对其进行排序。如果该列没有值,则应包含“NA”。

因此,生成的数据框应如下所示: enter image description here

最佳答案

使用 "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/

相关文章:

R:如何绘制 3D 数组

r - 为什么意味着不在Reduce中工作?

多个操作系统上的 RMarkdown utf-8 错误

r - 在 ggpairs 中加入独立的图例(采取 2)

r - 如何使用多个数据框对多个条件求和

r - 在R中以增量循环

r - 从 R 中的数据框创建连接矩阵

python - 使用 rpy2 和 ggplot2 制作图表

r - 两个数据帧之间的传输因子属性

r - 为什么 case_when 不能返回不同长度的向量?