R使用关键数据框替换多列的键

时间:2015-06-16 17:49:19

标签: r key match

我有一个包含100个问题的数据集(下面我有一个包含3个问题的子集)。 我想用" answer"中提供的实际答案替换所有答案ID。数据集。最终结果显示在"结果"数据框。

数据

 name   q1   q2  q3
 1      a    1    3  7 
 2      a    8    3  1
 3      a    3    9  2
 4      b   4    4  3

答案

 id   str  
    1   TRUE   
    2   FALSE   
    3   YES   
    4   NO
    5   LESS   
    6   MORE   
    7   GREATER   
    8   LESS
    9   NONE   
   10  DAILY   

结果

  name     q1   q2     q3
1    a    TRUE  YES   GREATER
2    a    LESS  YES   TRUE
3    a    YES   NONE  FALSE
4    b    NO    NO    YES

2 个答案:

答案 0 :(得分:5)

我们可以match数据集的元素('df1',没有'name'列)和'answer'中的'id'来获取数字索引(在这种情况下我们不需要match。通常,使用match)并获得相应的“str”可能更安全。

 df1[-1] <- answer$str[match(as.matrix(df1[-1]), answer$id)]
 df1
 # name   q1   q2      q3
 #1    a TRUE  YES GREATER
 #2    a LESS  YES    TRUE
 #3    a  YES NONE   FALSE
 #4    b   NO   NO     YES

或者使用lookup中的qdapToolskey/value列可以将 library(qdapTools) df1[-1] <- lookup(unlist(df1[-1]), answer) 列作为'data.frame'(即'answer')并获取匹配值

 df1[-1] <- with(answer, setNames(str, id))[as.character(unlist(df1[-1]))]

或者

UserRole deleteUserRoleObject = (UserRoles.Where(ur => ur.UserId == id)).Single();
        UserRoles.Remove(deleteUserRoleObject);
        SaveChanges();

答案 1 :(得分:1)

或使用索引:

my_decorator(lambda: print(datetime.datetime.now()) )()

可以将较大的任务细分为简化示例以测试方法。创建仅包含data[-1] <- sapply(data[-1], function(x) answer$str[x]) # name q1 q2 q3 # 1 a TRUE YES GREATER # 2 a LESS YES TRUE # 3 a YES NONE FALSE # 4 b NO NO YES 值的向量。 q1如果我们可以替换这四个,那么很有可能扩展操作:

v <- c(1,8,3,4)

这会创建第一个问题列。代码的其余部分是为每列重复该过程。

修改

没有answer$str[v] [1] TRUE LESS YES NO 的更快捷方式。只要查找列表按顺序排列并且不重复,它就会起作用:

sapply