R - 使用双括号和单括号在for循环中子集数据帧

Ste*_*ano 2 for-loop r square-bracket

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

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

我设法创建一个循环,它接受列的名称并将其附加到数据点(数据存储在数据框中lexicon:

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

这会产生:

  X.lx        X.ph
1 X.lx word   X.ph phonetic
2 X.lx word2  X.ph 
3 X.lx word3  X.ph phonetic2
Run Code Online (Sandbox Code Playgroud)

我试图设置循环,如数据框中的空数据点被跳过sub(),但没有成功.期望的输出将是

  X.lx        X.ph
1 X.lx word   X.ph phonetic
2 X.lx word2   
3 X.lx word3  X.ph phonetic2
Run Code Online (Sandbox Code Playgroud)

这是我的试用代码:

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

我收到这个警告:

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

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

Hon*_*Ooi 5

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
Run Code Online (Sandbox Code Playgroud)