与我以前的问题相关联:r plyr revalue limitation of number of operations? 此请求也是:mapvalues in plyr gives unexpected output when "to" argument is a factor...is it a bug?
我想更改数据帧因子中的级别值,我有一个因素,300个级别要重命名,另一个,3000个级别。所以使用c("","")是不可能的。我已经为重命名目的创建了两个新的数据帧,其中要匹配的值和要重新估值的值。现在我遇到了一个小问题,即我目前的R技能水平还无法解决。
让我们重用R菜谱示例:
首先使用值
创建一个数据框library(plyr)
cat <- c("alpha","beta","gamma","alpha","beta")
amount <- c(2, 5, 8, 3, 4)
df <- data.frame(cat, amount)
df
cat amount
1 alpha 2
2 beta 5
3 gamma 8
4 alpha 3
5 beta 4
mapvalues(df$cat, c("beta", "gamma"), c("two", "three"))
[1] alpha two three alpha two
Levels: alpha two three
这可行,将一个值更改为另一个值,并删除未使用的级别。
让我们尝试使用包含所有需要的值的数据框来匹配和替换它们的方法。
val <- c("beta", "gamma")
text <- c("two", "three")
reval <- data.frame(val, text)
reval
val text
1 beta two
2 gamma three
mapvalues(df$cat, reval$val, reval$text)
[1] alpha 2 1 alpha 2
Levels: alpha 2 1
这会将数字的值替换为数字。我有点卡在那里,因为我无法弄清楚如何调整我提供的第二个链接2中给出的解决方案。
答案 0 :(得分:2)
问题在于data.frame
会将您的角色转换为因素。因此,您可以使用stringsAsFactors=FALSE
或使用as.character
:
# version 1
val <- c("beta", "gamma")
text <- c("two", "three")
reval <- data.frame(val, text, stringsAsFactors=FALSE)
mapvalues(df$cat,
reval$val,
reval$text)
# version 2
val <- c("beta", "gamma")
text <- c("two", "three")
reval <- data.frame(val, text)
mapvalues(df$cat,
as.character(reval$val),
as.character(reval$text))
小心:使用levels
的解决方案取代了&#34; beta&#34; by&#34; three&#34;和#&#34; gamma&#34; by&#34; two&#34;而不是预期的替代&#34; beta&#34; by&#34; two&#34;和#&#34; gamma&#34; by&#34; three&#34;。这是因为&#34;三&#34;领先于&#34;两个&#34; ("h"<"w"
)。