如何在R中使用mapply循环?

3

我想在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

取而代之,期望的输出如下:
strings_concat

dsf.csv 
sdf.csv 
sdf.csv 

dsf.json 
sdf.json 
sdf.json 

dsf.xml
sdf.xml
sdf.xml

在每次迭代中,我希望将 strings_concat 与另一个数据框组合并保存。有没有简单的方法可以在R中完成这个任务?

2个回答

2
也许在这里,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" 

您可以将其添加到数据框中:

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) 并对这个组合后的数据帧进行一些操作。对于剩下的迭代也做同样的事情。 - user86907
在这种情况下,我认为你可以使用lapply。如果有帮助,请查看更新的答案。 - Ronak Shah
是的,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" - user86907
是的,Rokan,那很完美,但我得到的输出如下:[[1]] [1] "dsf.csv" "dsf.json" "dsf.xml" 相反,我希望csv在一组中,json在一组中,xml在一组中,这样我就可以遍历它们并将它们与另一个df组合。例如,如果我将函数结果保存为列表,则lists [[1]] = [[1]] [1] "dsf.csv" "sdf.csv" "sdf.csv" - user86907
你可以在lapply中迭代strings2$extension。我已经更新了答案。 - Ronak Shah

1

您需要做的就是确保不断扩充数据集。因此,我认为以下方法可以解决问题:

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)

注意:我现在不在电脑前,无法测试此代码。


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