【发布时间】:2018-02-09 20:53:47
【问题描述】:
我有一个类似于以下内容的数据框。 A1U_sweet 实际上是真实数据帧中的第 19 列,而 C1U_sweet 是真实数据帧中的第 39 列。有 20 列以 A## 开头,20 列以 C## 开头。
A1U_sweet A2F_dip A3U_bbq C1U_sweet C2F_dip C3U_bbq
1 2 1 NA NA NA
NA NA NA 4 1 2
2 4 7 NA NA NA
我想创建额外的列来组合 A 值和 C 值。生成的数据框将包含看起来像 B1U_sweet 和 B2F_dip 的列。
A1U_sweet A2F_dip A3U_bbq C1U_sweet C2F_dip C3U_bbq B1U_sweet B2F_dip
1 2 1 NA NA NA 1 2
NA NA NA 4 1 2 4 1
2 4 7 NA NA NA 2 4
有人建议我试试下面的代码。前两行有效,但在实施其余部分后,我收到一条错误消息。
types <- grep('^A([0-9]|[12][0-9])[A-Z]_[a-z]+', names(df)) ## Get all "A"
patterns
types <- substr(types, 2, Inf) ## Remove the "A"
for (tp in types) {
aa <- df[[paste0('A', tp)]] ## "A" column
cc <- df[[paste0('C', tp)]] ## "C" column
df[[paste0('B', tp)]] <- ifelse(is.na(aa), aa, cc)
}
这是错误信息:
Error in `[[<-.data.frame`(`*tmp*`, paste0("B", tp), value = logical(0)) :
replacement has 0 rows, data has 94
In addition: Warning message:
In is.na(aa) : is.na() applied to non-(list or vector) of type 'NULL'
数据确实有 94 列,但我不明白为什么会触发此错误。我将不胜感激任何帮助使此代码正常运行!
编辑:这是我迄今为止一直在做的事情。我必须进入并手动更改要组合的每组列的列名。一定有更好的方法!
df$B1U_sweetnsour<-A1U_sweetnsour
df$B1U_sweetnsour[is.na(df$B1U_sweetnsour)]<- C1U_sweetnsour[is.na(A1U_sweetnsour)]
【问题讨论】:
-
尝试将
value=TRUE放入您的grep语句中 - 否则它会返回索引,而不是值。