首页 > 解决方案 > 使用 Rbind 将元素添加到 R 中的数据框

问题描述

我正在使用 df1 和 df2 创建一个名为 Alleles_df 的 3 列(char、char、int)数据框:

Alleles_df <- data.frame('refsnp_id'=character(),'allele'=character(), 
   'chrom_start' = integer(),stringsAsFactors = F)

for (i in 1:nrow(df1)){    
   Alleles_df[i,] <- df1[(df1$col1[i]==df2$col1[i]),]
}

对于 i 的某些值,我收到以下错误:

x[[jj]][iseq] <- vjj 中的错误:替换的长度为零

这是因为 df1 和 df2 列与 i 的某些值不匹配。c("NA","NA",0)在这些情况下如何绑定一行?非常感谢您的帮助!

df1 是来自名为 biomart 的在线服务器的数据。df2 是我手动生成的。每个都有 3 列,分别是 Chromosome、Allele、BaseLocation。

    refsnp_id allele chrom_start
1 rs778598915  G/A/T    42693910
2  rs11541159    T/C    42693843
3 rs397514502    G/C    42693321
4 rs762949801    C/T    42693665
5 rs776304817  G/A/T    42693653

标签: rdataframerbind

解决方案


解释问题其实是按顺序的[]。在df1[i,][(df1$col1[i] == df2$col1[i]),]中,如果 df1 的第 i 行没有与 col1 匹配的行,则得到<0 rows> (or 0-length row.names). 但是df1[(df1$col1[i]==df2$col1[i]),][i,]如果df1中没有匹配col1的行,结果也是0行,但是那行i是,所以结果是一个NA填充行长度为3的数据帧。

编辑的解释自从你编辑:问题是不是df1的每一行都会有它们的col1匹配df2中同一行的col1。因此,为什么您会得到 0 行。[i,]在 ( ) 之后添加df1[( df1$col1[i] == df2$col1[i] ), ][i, ]仍然会给出长度为 3 (NAs) 的空行并且不会停止循环,但您也可以不执行循环(见下文)。

如果你真的想保持你的循环,你可以摆脱空行,比如Alleles_df <- Alleles_df[-which( rowSums( is.na( Alleles_df ), na.rm = T ) == ncol( Alleles_df ) ), ].

解决方案 但是,如果 df1 和 df2 具有相同的行数,并且所有可能匹配的等位基因始终位于 df1 和 df2 的同一行上,df1[df1$col1 == df2$col1, ]则会更快地获得相同的结果。

更好的解决方案 并且如果 df1 和 df2 的行数不同,或者如果您想获得所有具有匹配等位基因的行,即使它们不一定在数据框中的同一行上(例如 if 'rs778598915 ' 在 df1 的第 1 行可能在 df2 的第 5 行),您可以找到匹配的行并将其绑定到 Alleles_df 而无需像这样的循环:

Alleles_df <- rbind(df[sapply(df$col1, function(x) match(x, df2$col1, nomatch = 0) ),])

推荐阅读