Объединить избегать NA для создания многострочных переменных - PullRequest
0 голосов
/ 16 мая 2018

Поддельные данные

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

Переменная «Описание» киви, NA игнорируется!

Fruit: Kiwi
Weight: 6

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Прокручивать строки, удалять 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
0 голосов
/ 16 мая 2018

Это кажется немного хакерским, но для базового решения R мы можем использовать ifelse и is.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"

Демо

...