Замените все экземпляры чисел в фрейме данных строками R

#r #replace #dataframe

#r #заменить #фрейм данных

Вопрос:

Я рассматриваю возможность замены всех чисел в фрейме данных словами / строками. Каждое число будет заменено одним и тем же словом. например, все экземпляры числа 5 должны быть заменены на «банан», все экземпляры числа 10 на «киви» и так далее.

Вот пример фрейма данных. Имена строк и имена столбцов тоже являются числами:

 #    1  2  3  4  5  6
#1   7  7  7  7  7  7
#2   5  5  5  5  5  5
#3   4  4  4  4  4  4
#4   8  8  8  8  8  8
#5   1  1  1  1  1  1
#6   2  2  2  2  2  2
#7   6  6  6  6  3  3
#8   3  3  3  3  6  6
#9  10 10 10 10 10 10
#10 11 11 11 11 11 11
#11 12 12 12 12 12 12
#12  9  9  9  9  9  9
  

Вот пример данных (mydf) для воспроизведения этого:

 mydf<-structure(c(7, 5, 4, 8, 1, 2, 6, 3, 10, 11, 12, 9, 7, 5, 4, 8, 
1, 2, 6, 3, 10, 11, 12, 9, 7, 5, 4, 8, 1, 2, 6, 3, 10, 11, 12, 
9, 7, 5, 4, 8, 1, 2, 6, 3, 10, 11, 12, 9, 7, 5, 4, 8, 1, 2, 3, 
6, 10, 11, 12, 9, 7, 5, 4, 8, 1, 2, 3, 6, 10, 11, 12, 9), .Dim = c(12L, 
6L), .Dimnames = list(c("1", "2", "3", "4", "5", "6", "7", "8", 
"9", "10", "11", "12"), c("1", "2", "3", "4", "5", "6")))
  

Вот фрейм данных (mydata) Я построил, показывающий, какое число следует заменить на какое слово / фрукт:

 mydata <- data.frame(nums = c(1:12))                     
mydata$fruits<-c("apple", "pear", "orange", "melon", "banana", "grape", "pineapple",      "mango", "lemon", "kiwi", "guava", "peach")
  

Я пытался просматривать потоки с одинаковыми именами, но в основном они обсуждают изменение определенных частей фреймов данных (например, конкретных переменных или конкретных наблюдений), а не содержимого всего фрейма данных.

Я пытался использовать несколько команд gsub, но это не работает по нескольким причинам. Я предполагаю, что мне нужно использовать функцию для применения ко всем переменным в df, но не уверен, что именно.

Конечный результат должен выглядеть примерно так:

       1           2           3           4           5           6          
1  "pineapple" "pineapple" "pineapple" "pineapple" "pineapple" "pineapple"
2  "banana"    "banana"    "banana"    "banana"    "banana"    "banana"   
3  "melon"     "melon"     "melon"     "melon"     "melon"     "melon"    
4  "mango"     "mango"     "mango"     "mango"     "mango"     "mango"    
5  "apple"     "apple"     "apple"     "apple"     "apple"     "apple"    
6  "pear"      "pear"      "pear"      "pear"      "pear"      "pear"     
7  "grape"     "grape"     "grape"     "grape"     "orange"    "orange"   
8  "orange"    "orange"    "orange"    "orange"    "grape"     "grape"    
9  "kiwi"      "kiwi"      "kiwi"      "kiwi"      "kiwi"      "kiwi"     
10 "guava"     "guava"     "guava"     "guava"     "guava"     "guava"    
11 "peach"     "peach"     "peach"     "peach"     "peach"     "peach"    
12 "lemon"     "lemon"     "lemon"     "lemon"     "lemon"     "lemon"
  

Хотя в идеале кавычки не должны быть видны (хотя я не уверен, возможно ли это).

Ответ №1:

Вы можете сделать это с match помощью , которая ссылается на вектор поиска (ваш mydata ), возвращая позицию в этом векторе каждого элемента другого вектора.

 mydf[] <- mydata$fruits[match(mydf, mydata$nums)]
  

Если вы принудительно вводите значение a data.frame , кавычки не отображаются при выводе объекта на экран:

 as.data.frame(mydf)

#            1         2         3         4         5         6
# 1  pineapple pineapple pineapple pineapple pineapple pineapple
# 2     banana    banana    banana    banana    banana    banana
# 3      melon     melon     melon     melon     melon     melon
# 4      mango     mango     mango     mango     mango     mango
# 5      apple     apple     apple     apple     apple     apple
# 6       pear      pear      pear      pear      pear      pear
# 7      grape     grape     grape     grape    orange    orange
# 8     orange    orange    orange    orange     grape     grape
# 9       kiwi      kiwi      kiwi      kiwi      kiwi      kiwi
# 10     guava     guava     guava     guava     guava     guava
# 11     peach     peach     peach     peach     peach     peach
# 12     lemon     lemon     lemon     lemon     lemon     lemon    
  

Независимо от того, принудительно ли вы data.frame выполняете, вы можете указать quote=FALSE или запретить write.table write.csv кавычки вокруг символьных строк в экспортируемом файле.

Комментарии:

1. Поскольку данные поиска уже отсортированы, just mydf[] <- mydata$fruits[mydf] будет работать.

2. @thelatemail: Да, Батист упоминал то же самое. Я дал общеприменимое решение, поскольку я не хотел предполагать, что реальная проблема OP была такой же простой, как в примере.

3. Спасибо. Это отлично работает — как, собственно, и все предложения. Здорово, что такая проблема может быть решена несколькими способами. Также спасибо за общее решение. Очевидно, что моя реальная проблема с данными намного сложнее, чем в простом примере … и также не имеет ничего общего с fruit!

Ответ №2:

Поскольку плоды расположены в правильном порядке и индексируются 1:12 , вы можете использовать записи mydf для индексации в mydata$fruits :

 apply(mydf, 2, function(x) mydata$fruits[x])
  

Если значения расположены в неправильном порядке или не охватывают все возможные значения (имеют «дыры»), вы можете использовать коэффициент для перевода:

 apply(mydf, 2, function(x) factor(x, levels=mydata$nums, labels=mydata$fruits))
  

Ответ №3:

Другой возможный подход:

 library(qdapTools)
as.data.frame(apply(mydf, 2, lookup, mydata))

##            1         2         3         4         5         6
## 1  pineapple pineapple pineapple pineapple pineapple pineapple
## 2     banana    banana    banana    banana    banana    banana
## 3      melon     melon     melon     melon     melon     melon
## 4      mango     mango     mango     mango     mango     mango
## 5      apple     apple     apple     apple     apple     apple
## 6       pear      pear      pear      pear      pear      pear
## 7      grape     grape     grape     grape    orange    orange
## 8     orange    orange    orange    orange     grape     grape
## 9       kiwi      kiwi      kiwi      kiwi      kiwi      kiwi
## 10     guava     guava     guava     guava     guava     guava
## 11     peach     peach     peach     peach     peach     peach
## 12     lemon     lemon     lemon     lemon     lemon     lemon
  

Ответ №4:

replace здесь может сработать для вас.

 > replace(mydf, seq_along(mydf), mydata[[2]][mydf])
#    1           2           3           4           5           6          
# 1  "pineapple" "pineapple" "pineapple" "pineapple" "pineapple" "pineapple"
# 2  "banana"    "banana"    "banana"    "banana"    "banana"    "banana"   
# 3  "melon"     "melon"     "melon"     "melon"     "melon"     "melon"    
# 4  "mango"     "mango"     "mango"     "mango"     "mango"     "mango"    
# 5  "apple"     "apple"     "apple"     "apple"     "apple"     "apple"    
# 6  "pear"      "pear"      "pear"      "pear"      "pear"      "pear"     
# 7  "grape"     "grape"     "grape"     "grape"     "orange"    "orange"   
# 8  "orange"    "orange"    "orange"    "orange"    "grape"     "grape"    
# 9  "kiwi"      "kiwi"      "kiwi"      "kiwi"      "kiwi"      "kiwi"     
# 10 "guava"     "guava"     "guava"     "guava"     "guava"     "guava"    
# 11 "peach"     "peach"     "peach"     "peach"     "peach"     "peach"    
# 12 "lemon"     "lemon"     "lemon"     "lemon"     "lemon"     "lemon"   
  

И при необходимости его можно обернуть, as.data.frame чтобы удалить кавычки.