#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
чтобы удалить кавычки.