我有一个如下数据框,并希望通过将数据框中的字符替换为数字条件来生成另一个数据框。
condition:
GD 5
O 4.5
AV 3
B 2.5
dataframe:
Name Peter Paul Mary Chan Jose
Nokia B O O GD GD
iPhone AV O O O O
Moto AV AV O O AV
HTC B O AV AV AV
dput:
structure(list(Name = c("Nokia", "iPhone", "Moto", "HTC"), Peter =
c("B", "AV", "AV", "B"), Paul = c("O", "O", "AV", "O"), Mary =
c("O", "O", "O", "AV"), Chan = c("GD", "O", "O", "AV"), Jose =
c("GD", "O", "AV", "AV")), .Names =
c("Name", "Peter", "Paul", "Mary", "Chan", "Jose"), class = "data.frame", row.names = c(NA, -4L))
desired output:
Name Peter Paul Mary Chan Jose
Nokia 2.5 4.5 4.5 5 5
iPhone 3 4.5 4.5 4.5 4.5
Moto 3 3 4.5 4.5 3
HTC 2.5 4.5 3 3 3
感谢您的帮助!!!
答案 0 :(得分:7)
我不确定condition
的结构是什么,但假设它是一个命名向量
condition <- setNames(c(5, 4.5, 3, 2.5), c("GD", "O", "AV", "B"))
我只想,unlist
/ match
您的数据集并将其放回去
df[-1] <- condition[match(unlist(df[-1]), names(condition))]
df
# Name Peter Paul Mary Chan Jose
# 1 Nokia 2.5 4.5 4.5 5.0 5.0
# 2 iPhone 3.0 4.5 4.5 4.5 4.5
# 3 Moto 3.0 3.0 4.5 4.5 3.0
# 4 HTC 2.5 4.5 3.0 3.0 3.0
答案 1 :(得分:3)
一个选项是通过循环遍历列
来使用match
df1[-1] <- lapply(df1[-1], function(x) keyval$v2[match(x, keyval$v1)])
df1
# Name Peter Paul Mary Chan Jose
#1 Nokia 2.5 4.5 4.5 5.0 5.0
#2 iPhone 3.0 4.5 4.5 4.5 4.5
#3 Moto 3.0 3.0 4.5 4.5 3.0
#4 HTC 2.5 4.5 3.0 3.0 3.0
其中&#39; keyval&#39;是一个&#39; data.frame&#39;用&#39; v1&#39;和&#39; v2&#39;作为&#39;关键&#39;和&#39;价值&#39;列。
答案 2 :(得分:1)
这也有效(cdf是查找表):
cbind.data.frame(Name=df[,1], matrix(cdf$value[match(as.matrix(df[-1]), cdf$condition)],
nrow=nrow(df), dimnames=list(NULL, names(df[-1]))))
带输出
Name Peter Paul Mary Chan Jose
1 Nokia 2.5 4.5 4.5 5.0 5.0
2 iPhone 3.0 4.5 4.5 4.5 4.5
3 Moto 3.0 3.0 4.5 4.5 3.0
4 HTC 2.5 4.5 3.0 3.0 3.0