【问题标题】:Matching and factoring across data frames in R without For loop在没有 For 循环的 R 中跨数据帧进行匹配和分解
【发布时间】:2014-06-24 18:55:49
【问题描述】:

我有两个数据框,一个是调查响应选项(级别),一个是编码响应。跨数据框,列具有相同的名称但不一定具有相同的顺序。此外,在级别数据框架内,问题可能有不同数量的响应选项。

levels <- data.frame(restaurant=c("TACO BELL","CHIPOTLE",""),
                     would_recommend=c("YES","NO",""),
                     satisfaction=c("VERY SATISFIED","SATISFIED","UNSATISFIED"))                  

responses <- data.frame(satisfaction=c(2,2,1,1,3,3,2,2),
                        would_recommend=c(1,2,1,1,2,2,2,1),
                        restaurant=c(1,2,1,2,1,2,1,2))

响应本质上是水平与水平表中同名列的因子,因此我想将它们转换为因子。

我知道我可以这样做:

for (i in 1:length(responses)){
  resp_levels <- levels[,match(names(responses)[i],names(levels))]
  responses[,i]<-factor(x=resp_levels[responses[,i]],levels=resp_levels)
}

有没有一个聪明的方法可以在没有 For 循环的情况下做到这一点?

【问题讨论】:

  • 请不要害怕这里的 for 循环。恕我直言,您的解决方案足够聪明。这样的任务肯定不会成为您代码中的瓶颈,除非您对其进行数千次评估...

标签: arrays r for-loop


【解决方案1】:

我通常同意@gogolews 的观点,即如果 for 循环对您有用,那么它没有任何问题,尤其是像您这样的简单循环。然而,如果你真的想要一个非循环的解决方案,这里有一个包tidyrdplyr。这在一个非常庞大的数据集上可能会更快,但很难确定:

library(dplyr)
library(tidyr)

首先,将响应收集到一个长格式的 data.frame 中,并添加一个 id 变量,以便我们知道稍后将它们组合在一起。我们将因子转换为字符,以便稍后按名称对其进行索引

new_responses <- responses %>% mutate(id = row_number(restaurant)) %>% 
gather(question,  response, -id) %>% mutate(question = as.character(question)) 

现在使用 dplyr 从关卡 data.frame 中获取适当的关卡,然后使用 tidyr 将其展开为短格式并删除不再需要的 id。

responses2 <- new_responses %>% rowwise %>% 
mutate(response = as.character(levels[response, question])) %>% 
spread(question, response) %>% select(-id)
responses2

Source: local data frame [8 x 3]

  restaurant   satisfaction would_recommend
1  TACO BELL      SATISFIED             YES
2  TACO BELL VERY SATISFIED             YES
3  TACO BELL    UNSATISFIED              NO
4  TACO BELL      SATISFIED              NO
5   CHIPOTLE      SATISFIED              NO
6   CHIPOTLE VERY SATISFIED             YES
7   CHIPOTLE    UNSATISFIED              NO
8   CHIPOTLE      SATISFIED             YES

请注意,行的顺序不一定与原始行的顺序相同,但可以通过使用 id 变量来使用新的 data.frame 来做到这一点。

【讨论】:

    猜你喜欢
    • 2020-03-15
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-20
    • 1970-01-01
    • 2015-07-25
    • 2021-08-10
    • 1970-01-01
    相关资源
    最近更新 更多