假设我在数据框中有一个列,颜色为c("Red", "Blue", "Blue", "Orange")
。
我想把它作为c(1,2,2,3)
。
Red as 1
Blue as 2
Orange as 3
除了明显的if / else或switch函数之外,还有一种更简单的方法吗?
答案 0 :(得分:8)
设置一个命名向量,描述颜色和整数之间的联系(即具体如何将字符串映射到整数):
colors=c(1,2,3)
names(colors)=c("Red", "Blue", "Orange")
现在使用命名向量生成与数据框中颜色关联的数字列表:
>colors[c("Red","Blue","Blue","Orange")]
Red Blue Blue Orange
1 2 2 3
更新以解决以下问题。这是我认为你想要做的一个例子。
dataframe=data.frame(Gender=c("F","F","M","F","F","M"))
strings=sort(unique(dataframe$Gender))
colors=1:length(strings)
names(colors)=strings
dataframe$Colours=colors[dataframe$Gender]
可以查看结果:
> dataframe
Gender Colours
1 F 1
2 F 1
3 M 2
4 F 1
5 F 1
6 M 2
请注意,此示例假定您在Gender和Colors之间没有特定的映射。如果情况确实如此,那么仅仅关注@alexis_laz的评论可能更简单。
答案 1 :(得分:3)
我必须遗漏一些东西,但我相信这种方法会起作用。使用单词(下面,"名称")强制您的列到一个因子,您revalue
用你的数字"颜色"。
require(plyr)
colors <- c("1","2","3")
names <- c("Red", "Blue", "Orange")
df <- data.frame(names, colors)
df$names <- as.factor(df$names)
df$names <- revalue(x = df$names, c("Red" = 1, "Blue" = 2, "Orange" = 3))
答案 2 :(得分:0)
使用 car :: recode()功能:
library(car)
recode(x, "'Red'=1; 'Blue'=2; 'Orange'=3;")
# [1] 1 2 2 3
答案 3 :(得分:0)
这是基于先前代码的功能:
# Recode 'string' into 'integer'
recode_str_int <- function(df, feature) {
# 1. Unique values
# 1.1. 'string' values
list_str <- sort(unique(df[, feature]))
# 1.2. 'integer' values
list_int <- 1:length(list_str)
# 2. Create new feature
# 2.1. Names
names(list_int) = list_str
df$feature_new = list_int[df[, feature]]
# 3. Result
df$feature_new
} # recode_str_int
这样称呼:
df$new_feature <- recode_str_int(df, "feature")