【问题标题】:Separate a column of variable and a column of values into their components in r将一列变量和一列值分成它们在r中的组件
【发布时间】:2018-09-19 01:41:48
【问题描述】:

我有以下数据框 (df),其中对于每个参与者,“成绩”列是通过粘贴某些项目的分数来构建的。例如,参与者“1”在一个项目“a”上获得了 4,在项目“b”上获得了 7,在项目“c”上获得了 8。 (请注意,等级是一个字符)。另请注意,参与者“2”只有两个分数(假设这是与参与者“1”不同的考试)。

df = data.frame(participants = c(1, 1, 2),
                variables = c('abc', 'ef', 'abc'),
                grades= c('478', '58', '942'),
                stringsAsFactors = FALSE)


 participants variables grades
1            1       abc    478
2            1        ef     58
3            2       abc    942

(我的数据包含 100,000 行,如上。)

我想把数据转换成整洁的样式,如下:

  participants variables grades
1            1         a      4
2            1         b      7
3            1         c      8
4            1         e      5
5            1         f      8
6            2         a      9
7            2         b      4
8            2         c      2

我做了什么

variables =  lapply(X=1:length(df$variables), FUN=function(X) {
  strsplit(df$variables[X], "") %>% .[[1]]}) %>% reduce(c)

grades =  lapply(X=1:length(df$grades), FUN=function(X) {
  strsplit(df$grades[X], "") %>% .[[1]]}) %>% reduce(c)

participants =  lapply(X=1:length(df$participants), FUN=function(X) {
  rep(df$participants[X], nchar(df$variables[X])) })%>% reduce(c)

data.frame(participants, variables, grades)

然而,在我的机器上处理我的真实数据需要几分钟,我觉得它真的效率不高,因为我需要 3 个不同的调用。

欢迎任何关于获取整洁数据的有效方法的想法(我与 tidyr/dplyr 合作)

【问题讨论】:

    标签: r list dataframe dplyr tidyr


    【解决方案1】:

    您可以使用strsplitunnest

    library(tidyverse)
    df %>% mutate_at(vars(variables,grades),~strsplit(.,"")) %>% unnest
    
    #   participants variables grades
    # 1            1         a      4
    # 2            1         b      7
    # 3            1         c      8
    # 4            1         e      5
    # 5            1         f      8
    # 6            2         a      9
    # 7            2         b      4
    # 8            2         c      2
    

    【讨论】:

    • 我想使用separate_rows,在这种情况下看起来更合乎逻辑,但它不接受""分隔符。
    • 绝对是我想要的!不知道 unnest 函数
    【解决方案2】:

    data.table 解决方案

    setDT(df)
    df[,lapply(.SD,function(x){strsplit(x,"") %>% unlist}),.SDcols=c("variables","grades"),by=participants]
    

    结果:

       participants variables grades
    1:            1         a      4
    2:            1         b      7
    3:            1         c      8
    4:            1         e      5
    5:            1         f      8
    6:            2         a      9
    7:            2         b      4
    8:            2         c      2
    > 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2020-05-24
      • 2021-01-06
      • 2018-08-30
      相关资源
      最近更新 更多