【问题标题】:How to loop through mapply in R?如何在R中循环遍历mapply?
【发布时间】:2020-12-10 09:17:21
【问题描述】:

我正在尝试使用 R 中的 mapply 函数连接字符串。但是,我希望其中一个字符串在 mapply 函数中是可变的。我的代码如下:

strings<-data.frame(x=c("dsf","sdf","sdf"))
strings2<-data.frame(extension=c(".csv",".json",".xml"))

for (i in 1:3)
{
  strings_concat<-mapply(function(string1,string2) paste0(string1,string2),strings$x,strings2$extension[i])%>%
    data.frame()%>%
    unlist()%>%
    data.frame()

 #dosomething with strings_concat
}

但这只是给我最后一次迭代

strings_concat

dsf.xml
sdf.xml
sdf.xml

bust 相反,所需的输出如下:

strings_concat

dsf.csv 
sdf.csv 
sdf.csv 

dsf.json 
sdf.json 
sdf.json 

dsf.xml
sdf.xml
sdf.xml

在每次迭代中,我都想将 strings_concat 与另一个数据框结合起来并保存。如果在 R 中有一种简单的方法可以做到这一点,任何人都可以帮助我吗?

【问题讨论】:

    标签: r dataframe concat mapply stringi


    【解决方案1】:

    也许,outer 是一个更好的选择:

    strings_concat <- c(outer(strings$x, strings2$extension, paste0))
    strings_concat
    #[1] "dsf.csv"  "sdf.csv"  "sdf.csv"  "dsf.json" "sdf.json" "sdf.json" 
    #    "dsf.xml"  "sdf.xml"  "sdf.xml" 
    

    您可以将其添加到 data.frame 中:

    df <- data.frame(strings_concat)
    

    如果您想在每次迭代中添加一些额外的步骤,您可以使用lapply

    lapply(strings2$extension, function(x) {
      strings_concat <- paste0(strings$x, x)
      #do something with strings_concat
    })
    

    【讨论】:

    • 这是解决这个问题的好方法,但我想在每次迭代时对 strings_concat 做一些事情,有什么办法可以解决吗?例如,在第一次迭代中,cbind(anotherdataframe,strings_concat),并对这个组合的数据框做一些事情。在剩下的迭代中做同样的事情
    • 在这种情况下,我认为您可以使用lapply。如果有帮助,请查看更新的答案。
    • 是的,这是完美的 Rokan,但我得到的输出如下: [[1]] [1] "dsf.csv" "dsf.json" "dsf.xml" [[2] ] [1] “sdf.csv” “sdf.json” “sdf.xml” [[3]] [1] “sdf.csv” “sdf.json” “sdf.xml”
    • 是的,这是完美的 Rokan,但我得到的输出如下: [[1]] [1] "dsf.csv" "dsf.json" "dsf.xml" 相反,我想要csv 属于一组,json 属于一组,xml 属于一组,这样我就可以遍历它们并将它们与另一个 df 组合。例如,如果我将函数结果保存为列表,则 lists[[1]]= [[1]] [1] "dsf.csv" "sdf.csv" "sdf.csv"
    • 您可以在 strings2$extension 上进行迭代,而不是在 lapply 中进行迭代。我已经更新了答案。
    【解决方案2】:

    您需要做的就是确保不断扩充您的数据集。所以我认为这应该可以解决问题:

    strings<-data.frame(x=c("dsf","sdf","sdf"))
    strings2<-data.frame(extension=c(".csv",".json",".xml"))
    
    # We are going to keep adding things to results
    results = NULL
    
    for (i in 1:3)
    {
      strings_concat<-mapply(function(string1,string2) paste0(string1,string2),strings$x,strings2$extension[i])%>%
        data.frame()%>%
        unlist()%>%
        data.frame()
     # Here is where we keep adding things to results
     results = rbind(results, strings_concat)
    }
    
    print(results)
    

    注意:不要在带有 R 的计算机前,因此此代码未经测试

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2012-05-22
      相关资源
      最近更新 更多