需要帮助在 R 中循环连接

Posted

技术标签:

【中文标题】需要帮助在 R 中循环连接【英文标题】:Need help looping through concatenation in R 【发布时间】:2019-08-10 16:08:10 【问题描述】:

您好,我正在尝试返回包含 iris 数据集中所有列的子集的字符串。我正在寻找的输出是 'iris$Sepal.Length', 'iris$Sepal.Width', 'iris$Petal.Length', 'iris$Petal.Width', 'iris$Species'。

我尝试了下面的代码,使用 paste0 函数执行了一个 for 循环,但没有返回任何内容。

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

我该如何解决这个问题?

【问题讨论】:

你能解释一下你想用字符串向量做什么吗?这可能是一个 XY 问题,并且可能有更好的方法来解决您的问题。 【参考方案1】:

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"   

【讨论】:

【参考方案2】:

使用你自己的逻辑,你的代码可以修正如下:

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 的解决方案是优雅的。我只是想展示可以对您的特定循环进行的更正。

【讨论】:

这真的不是一个好的解决方案,绝对不应该是公认的答案;如果您想知道如何更正 OP 语法,请查看@RonakShah 的答案。然而,更重要的是,指出paste0 已经被矢量化(再次参见 Ronak 的帖子)是至关重要的。 SO 是关于(理想情况下)概括并适用于其他未来问题的最佳编码实践和解决方案的集合。 @MauritsEvers 我同意这不是最佳解决方案。根据 OP 的代码,他们似乎是初学者,其想法是引导他们完成逻辑。但是,为了保持最佳实践,如果您认为我应该删除此答案,请告诉我?请指教。

以上是关于需要帮助在 R 中循环连接的主要内容,如果未能解决你的问题,请参考以下文章

R中的并行计算,用于通过循环保存数据

R语言中关于for语句中向量循环赋值求助

提高嵌套 for 循环速度 R 创建邻接矩阵

如何在R中的循环中运行(更改)JavaScript文件?

在 R / dplyr 中循环完全连接

在 if 语句的帮助下,让 R 在 while 循环中跳过某些索引值