根据另一列操作列

时间:2016-02-22 17:30:05

标签: r

我的数据如下: https://gist.github.com/anonymous/dea36ef7b86f71120d50

首先我加载如下数据

df <- read.delim(".../sample.txt", header=TRUE, sep="\t", fill=TRUE, row.names=1)

然后我只保留我想要的列,如下所示

dfm<- df[,c(match(c('m'), colnames(df)),
               unlist(lapply(c("mm"), 
                          function(x) grep(x, colnames(df)))))]

作为示例 dfm 的前两列看起来像这样

row.names                                                   
CON__A2A4G1                                                          0.880950
CON__A2A5Y0                                                          0.034051
CON__A2AB72                                                          0.079625
CON__ENSEMBL                                     NaN
CON__ENSEMBL:ENSBTAP00000024146                                      0.133800
CON__ENSEMBL:ENSBTAP00000024466;CON__ENSEMBL:ENSBTAP00000024462      0.288080
CON__ENSEMBL:ENSBTAP00000025008                                       NaN
CON__ENSEMBL:ENSBTAP00000038253                                      0.101990
sp|O43790|KRT86_HUMAN;CON__O43790                                    0.970460
sp|O76009|KT33A_HUMAN;CON__O76009;CON__Q6NTB9                        0.521410

我想创建另一个数据框或矩阵或......列名与df相同。 然后检查第二列,如果它有值,则粘贴第一列的名称,如果它是NA或空,写入NA或没有 第三列和第四列相同......直到结束

示例输出(仅适用于第二列)如下所示。

CON__A2A4G1                                                          
CON__A2A5Y0                                                         
CON__A2AB72                                                         
**Nothing**                                       
CON__ENSEMBL:ENSBTAP00000024146                                      
CON__ENSEMBL:ENSBTAP00000024466;CON__ENSEMBL:ENSBTAP00000024462      
**Nothing**                                       
CON__ENSEMBL:ENSBTAP00000038253                                     

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

 df <- read.delim("example.txt", header=TRUE, sep="\t", fill=TRUE, row.names=1,  stringsAsFactors=FALSE, na.strings='')
 df[] <- lapply(df, as.numeric)

 dfm<- df[,c(match(c('Ratio.H.L.normalized'), colnames(df)),
        unlist(lapply(c("Ratio.H.L.normalized.Mo"), 
                      function(x) grep(x, colnames(df)))))]

 dfm[] <- lapply(dfm, function(x) ifelse(is.na(x), "", rownames(dfm)) )

首先,我替换所有字符串&#34; NA&#34;实际NA s。确保所有值都应该是数字或缺失,否则这是一件至关重要的事情。然后,沿着所有列,只要缺少值,我就用rowname替换值。

注1:我想知道上述过程在哪种情况下是有用的,并且如果您的描述有点偏离并且您实际上只想保留所有值都不丢失的行,请查看{{ 1}}。

注意2:从大型数据集中提取列的方式对我来说有点复杂。我确信它是正确的,但您也可以尝试以下几行:

?complete.cases

这应该给出相同的结果,但更容易阅读。

编辑:对所需解决方案的误解和切换library(dplyr) dfm <- select(df, contains("Ratio.H.L.normalized")) - 陈述以反映评论。

编辑2:可能更容易解决的问题如下:

ifelse

首先,我创建一个大矩阵,其中包含与初始 name_mat <- matrix(rep(rownames(dfm), ncol(dfm)), ncol=ncol(dfm), nrow = length(rownames(dfm))) dfm_ind <- is.na(dfm) name_mat[!dfm_ind] <- NA 数据帧具有相同维度的所有rownames。然后我创建一个索引,告诉我dfm数据帧中的哪些条目丢失。然后我使用该索引替换重复rownames矩阵中的值。如果需要,您可以使用dfmnames()函数更改列名称,以便协调列名称。