r - 使用 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
解决方案
解释问题其实是按顺序的[]
。在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) ),])
推荐阅读
- java - javax.el.ELException:无法将 [class java.lang.String] 类型的 [2020-01-28T12:53:00.000+0000] 转换为 [class java.util.Date]
- sql - 我正在尝试编写一些访问 SQL 来查询报告并计算优先级
- laravel - 为什么在 Laravel 中保存数据时出现意外的重定向 (302) 错误?
- suitescript - 如何在 Suitelet (suitescript 2.0) 的字段中获取采购订单列表?
- apache - .htaccess 文件中的 RewriteRule 中的替换真正取代了什么?
- php - 同一页面上有多个 AJAX 表单?
- python - 如何将 url 映射到 Django 中的视图,获取 AttributeError: module 'myproject.views' has no attribute
- python - 不可散列的类型
- jenkins - 访问 Jenkins 中的魅力报告统计信息(使用 Webdriverio 进行测试)
- automata - DFA 中的最小状态数