Как присвоить числовое значение новому слову в столбце в R - PullRequest
2 голосов
/ 22 марта 2019

Я присваиваю значения списку фруктов, как это в R.

#input csv of fruits

fruits
 apple
 pineapple
 orange
 pear

fruits <- data.frame(fruits = c("apple", "pineapple", "orange", "pear"))

mapping <- c("apple" = 1, "orange"= 10, "pear" = 5,"pineapple" = 11)

fruits$value <- mapping[fruits[,1]]

#output

fruits     value
 apple     1
 pineapple 11
 orange    10
 pear      5

Когда список фруктов обновляется, скажем, добавляя манго и киви, я хочу любое возможное неожиданное слово / текстfruit, которому нужно присвоить числовое значение 1 без добавления этого конкретного слова в отображение.

Запуск кода с новыми фруктами выдает это.

fruits     value
 apple     1
 pineapple NA
 orange    11
 pear      NA
 mango     5
 kiwi      10

fruits2 = data.frame(fruits = 
  c("apple", "pineapple", "orange", "pear", "mango", "kiwi"))

Я ожидаю, что NAбыть с манго и киви, но это не так.

Как мне присвоить значение 1 новым фруктам, не включенным в исходное отображение?

Спасибо

Ответы [ 4 ]

1 голос
/ 22 марта 2019

Вот решение по делу:

library(tidyverse)
fruits2 %>%
  left_join(enframe(mapping),by=c(fruits="name")) %>%
  replace_na(replace = list(value=1))
#      fruits value
# 1     apple     1
# 2 pineapple    11
# 3    orange    10
# 4      pear     5
# 5     mango     1
# 6      kiwi     1
# Warning message:
# Column `fruits`/`name` joining factor and character vector, coercing into character vector
1 голос
/ 22 марта 2019

Прежде всего, если fruits является фактором, преобразуйте его в символ

df$fruits <- as.character(df$fruits)

Тогда вы сделаете

df$value <- mapping[df$fruits]

df
#     fruits value
#1     apple     1
#2 pineapple    11
#3    orange    10
#4      pear     5
#5     mango    NA
#6      kiwi    NA

Это даст NA с для fruitsкоторых нет в mapping.Теперь поверните NA s в 1.

df$value[is.na(df$value)] <- 1

df
#     fruits value
#1     apple     1
#2 pineapple    11
#3    orange    10
#4      pear     5
#5     mango     1
#6      kiwi     1
1 голос
/ 22 марта 2019

Как мне присвоить значение 1 новым фруктам, не включенным в исходное отображение?

Если вы просто просматриваете один столбец, match - это вариант:

mymapping = c(mapping, default = 1)
m = match(fruits2$fruits, names(mymapping), nomatch=length(mymapping))

fruits2$value = mymapping[m]

     fruits value
1     apple     1
2 pineapple    11
3    orange    10
4      pear     5
5     mango     1
6      kiwi     1
1 голос
/ 22 марта 2019

Из вашего вектора отображения создайте кадр данных отображения, затем используя merge

mapdf = data.frame(fruits = names(mapping), value = mapping, row.names = NULL)

yourdf = merge(df,mapdf,by = 'fruits',all.x = T)
yourdf
     fruits value
1     apple     1
2      kiwi    NA
3     mango    NA
4    orange    10
5      pear     5
6 pineapple    11

О заполнении NA до 1

yourdf$value[is.na(yourdf$value)] = 1
...