【问题标题】:R - Subsetting dataframe in for loop with double and single bracketsR - 使用双括号和单括号在 for 循环中设置数据帧
【发布时间】:2014-09-04 12:58:18
【问题描述】:

我正在尝试创建一个 for 循环,将字符串附加到数据框中的每个数据点。我正在使用 for 循环,因为数据框可能会随列数而变化。这是可能的数据框的示例。

lexicon <- data.frame(
    X.lx = c("word", "word2", "word3"),
    X.ph = c("phonetic", "", "phonetic2")
)

我设法创建了一个循环,该循环采用列的名称并将其附加到数据点(数据存储在数据框lexicon

for(i in names(lexicon)){
   lexicon[[i]] <- sub("^", paste(names(lexicon[i]), " ", sep=""), lexicon[[i]])
}

这会产生:

  X.lx        X.ph
1 X.lx word   X.ph phonetic
2 X.lx word2  X.ph 
3 X.lx word3  X.ph phonetic2

我正在尝试设置循环,例如数据框中的空数据点被sub()跳过,但没有成功。所需的输出将是

  X.lx        X.ph
1 X.lx word   X.ph phonetic
2 X.lx word2   
3 X.lx word3  X.ph phonetic2

这是我的试用代码:

for(i in names(lexicon)){
   lexicon[[i]][which(lexicon[[i]] != "")] <- sub("^", paste(names(lexicon[i]), " ", sep=""), lexicon[[i]][which(lexicon[[i]] != "")])
}

我收到此警告:

Warning messages:
1: In `[<-.factor`(`*tmp*`, which(lexicon[[i]] != ""), value = c(NA_integer_,  :
invalid factor level, NA generated

如何正确实现要跳过的空单元格?

【问题讨论】:

标签: r for-loop square-bracket


【解决方案1】:
lexicon[] <- mapply(function(x, n) {
  ifelse(x == "", "", paste(n, x))
}, lexicon, names(lexicon))
lexicon
#         X.lx           X.ph
# 1  X.lx word  X.ph phonetic
# 2 X.lx word2               
# 3 X.lx word3 X.ph phonetic2

【讨论】:

  • (+1) 只是要发布这个。希望您不介意我对其进行了修改,使其与所需的输出相匹配
  • 我必须添加 stringsAsFactors=FALSE 并且它起作用了。
猜你喜欢
  • 1970-01-01
  • 2022-12-05
  • 2011-01-12
  • 1970-01-01
  • 2020-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多