需要帮助在R中循环拼接字符串。

3

你好,我想返回子集所有iris数据集中的列名。我需要的输出是'iris$Sepal.Length', 'iris$Sepal.Width', 'iris$Petal.Length', 'iris$Petal.Width', 'iris$Species'。

我尝试了以下代码,使用paste0函数进行循环,但没有任何返回结果。

最初的回答:

for(i in colnames(iris)){
    paste0('iris$',i , collapse ="")
}

我该怎么解决这个问题?


1
你能详细解释一下你想用字符串向量做什么吗?这可能是一个XY问题,也许有更好的方法来解决你的问题。 - Maurits Evers
2个回答

6

paste0可以向量化,因此您可以直接执行以下操作:

paste0("iris$", names(iris))
#[1] "iris$Sepal.Length" "iris$Sepal.Width"  "iris$Petal.Length" 
#    "iris$Petal.Width"  "iris$Species" 

for 循环中,您需要明确告诉R做什么。

for(i in colnames(iris)){
   print(paste0('iris$',i))
}

#[1] "iris$Sepal.Length"
#[1] "iris$Sepal.Width"
#[1] "iris$Petal.Length"
#[1] "iris$Petal.Width"
#[1] "iris$Species"

或者您可以将其存储在字符向量中

string_name <- character(length = ncol(iris))
for(i in seq_along(names(iris))){
   string_name[i] <- paste0('iris$',names(iris)[i])
}

string_name
#[1] "iris$Sepal.Length" "iris$Sepal.Width"  
#"iris$Petal.Length" "iris$Petal.Width"  "iris$Species"   

1

使用您自己的逻辑,您的代码可以按以下方式进行更正:

for( i in 1:length(colnames(iris)) ){
  print( paste0('iris$', colnames(iris)[i] , collapse ="") )
}

[1] "iris$Sepal.Length"
[1] "iris$Sepal.Width"
[1] "iris$Petal.Length"
[1] "iris$Petal.Width"
[1] "iris$Species"

然而@ronak-shah的解决方案更加优雅。我只是想展示一下对你特定循环可以进行的更正。


2
这真的不是一个好的解决方案,绝对不应该被接受为答案;如果你想知道如何纠正OP的语法,请看@RonakShah的回答。然而更重要的是,关键是要指出paste0已经向量化了(再次参见Ronak的帖子)。SO是关于最佳编码实践和解决方案的集合,这些解决方案(理想情况下)可以推广并适用于其他未来的问题。 - Maurits Evers
1
@MauritsEvers 我同意这不是最优解。基于提问者的代码,他们似乎是初学者,我们旨在引导他们理清逻辑。然而,为了遵循最佳实践,请告诉我你是否认为我应该删除这个答案?请给予建议。 - NM_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接