R在数据框中将字符串更改为数字

时间:2016-11-10 09:19:09

标签: r dataframe grep match

我有一个如下数据框,并希望通过将数据框中的字符替换为数字条件来生成另一个数据框。

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

感谢您的帮助!!!

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