我一直在努力(作为初学者)来做到这一点。我有一个文本,我希望将一些部分替换为数据框的行条目(或矩阵,如果这更容易)。 我有一个示例数据集如下:
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"
我试过重复,因为,如果,虽然,但我得到第一个,最后一个或所有组合返回。 我怎样才能定义每行只需要一个句子?
感谢您的帮助。
答案 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(...))