为R中的每一行运行一个循环

时间:2016-07-13 16:52:43

标签: r row

我一直在努力(作为初学者)来做到这一点。我有一个文本,我希望将一些部分替换为数据框的行条目(或矩阵,如果这更容易)。 我有一个示例数据集如下:

   x      y      z
1  5  apple  green
2  7 banana yellow
3 13  mango    red

我被困在这个:

for (x in mydata[["x"]]) {
    for (y in mydata[["y"]]) {
        for (z in mydata[["z"]]) {
            print(paste("The year is", x, y,"color", z))
        }
    }
}

然而,这会呈现具有所有可能组合的文本。 我想得到:

"The year is 5 apple color green"
"The year is 7 banana color yellow"
"The year is 13 mango color red"

我试过重复,因为,如果,虽然,但我得到第一个,最后一个或所有组合返回。 我怎样才能定义每行只需要一个句子?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我们不需要循环,因为paste已经过矢量化。

paste("This year is", df1$x, df1$y, "color", df1$z)

或使用sprintf

sprintf("This year is %s %s color %s", df1$x, df1$y, df1$z) 

或者没有致电' df1' 3次

do.call(sprintf, c(df1, fmt = "This year is %s %s color %s")) 
#[1] "This year is 5 apple color green"   "This year is 7 banana color yellow"
#[3] "This year is 13 mango color red"  

OP的帖子使用了嵌套的for循环,因此我们获得了所有组合而不是预期的组合。我们可以循环遍历行序列,使用它作为索引来提取每列的元素并paste

for(i in seq_len(nrow(df1))){
   print(paste("This year is", df1$x[i], df1$y[i], "color", df1$z[i]))
 } 
#[1] "This year is 5 apple color green"
#[1] "This year is 7 banana color yellow"
#[1] "This year is 13 mango color red"

数据

df1 <- structure(list(x = c(5L, 7L, 13L), y = c("apple", "banana", "mango"
), z = c("green", "yellow", "red")), .Names = c("x", "y", "z"
), class = "data.frame", row.names = c("1", "2", "3"))

答案 1 :(得分:0)

仅添加解决方案,因为尚未提及apply系列函数。

我的一线解决方案:

df = data.frame(x=c(5,7,13), y = c('apple', 'banana','mango'), z = c('green', 'yellow', 'red'))

apply(df,1, function(a) paste("This year is", a[1], a[2], "color", a[3]) )

给出了:

[1] "This year is  5 apple color green"
[2] "This year is  7 banana color yellow"
[3] "This year is 13 mango color red"   

此外,一次打印输出一行很容易:

writeLines(paste(...))