【问题标题】:Concatenate avoiding NAs to produce multiline variable连接避免 NA 以产生多行变量
【发布时间】:2018-10-26 14:02:11
【问题描述】:

假数据

Fruit <- c("Tomato", "Banana", "Kiwi", "Pear")
Colour <- c("Red", "Yellow", NA, "Green")
Weight <- c(10, 12, 6, 8)

dd <- data.frame(Fruit, Colour, Weight)

尝试失败

dd <- dd %>%
  mutate(Description = sprintf("%s: %s \n%s: %s \n%s: %s",
                               names(dd)[1], Fruit,
                               names(dd)[2], Colour,
                               names(dd)[3], Weight))

dd$Description[1]

所需输出:多行“描述”变量忽略 NA。

番茄的“描述”变量:

Fruit: Tomato
Colour: Red
Weight: 10

Kiwi 的“描述”变量,NA 被忽略!

Fruit: Kiwi
Weight: 6

【问题讨论】:

  • 我认为您在样本数据中将猕猴桃与杏子混为一谈。

标签: r dataframe concatenation missing-data


【解决方案1】:

遍历行,删除 NA,然后粘贴:

dd$Description <- unlist(
  apply(dd, 1, function(i) {
    x <- na.omit(i)
    paste(paste0(names(x),":", x), collapse = "\n")
  }))

dd
#    Fruit Colour Weight                            Description
# 1 Tomato    Red     10    Fruit:Tomato\nColour:Red\nWeight:10
# 2 Banana Yellow     12 Fruit:Banana\nColour:Yellow\nWeight:12
# 3   Kiwi   <NA>      6                  Fruit:Kiwi\nWeight: 6
# 4   Pear  Green      8    Fruit:Pear\nColour:Green\nWeight: 8

【讨论】:

  • 感谢您的回答!我们可以将“描述”作为多行吗? \n 似乎没有发挥它的作用。
  • @user3262756 多行试试:cat(dd$Description)
  • 好的,非常感谢!正是我需要做的。我选择这个答案是因为在查看新变量“描述”时,我们在 NAs 位置没有看到空格。
【解决方案2】:

这感觉有点骇人听闻,但对于基本的 R 解决方案,我们可以使用 ifelseis.na 有条件地渲染一个属性,或者只是空字符串:

sprintf("%s\n%s\n%s",
    ifelse(is.na(Fruit), "", paste0(names(dd)[1], ": ", Fruit)),
    ifelse(is.na(Colour), "", paste0(names(dd)[2], ": ", Colour)),
    ifelse(is.na(Weight), "", paste0(names(dd)[3], ": ", Weight)))

[1] "Fruit: Tomato\nColour: Red\nWeight: 10"
[2] "Fruit: Banana\nColour: Yellow\nWeight: 12"
[3] "Fruit: Kiwi\n\nWeight: 6"                   <-- Kiwi has no colour
[4] "Fruit: Pear\nColour: Green\nWeight: 8"

Demo

【讨论】:

  • 非常感谢您的回答,但是有没有办法将变量格式化为多行?
  • @user3262756 不确定您的意思。我的代码 sn-p 中的输出已经是多行的,因为文本由 \n 分隔。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
  • 2017-12-26
  • 2014-11-18
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多