【问题标题】:Convert comma separated string to numeric columns将逗号分隔的字符串转换为数字列
【发布时间】:2012-01-17 20:33:19
【问题描述】:

我有一个包含几列的数据集,其中一列是反应时间。这些反应时间用逗号分隔,表示不同试验(同一参与者的)反应时间。

例如:第 1 行(即:参与者 1 的数据)在“反应时间”列下有以下内容

reaction_times
2000,1450,1800,2200

因此这些是参与者 1 对试验1,2,3,4 的反应时间。

我现在想创建一个新数据集,其中这些试验的反应时间都形成单独的列。这样我可以计算每个试验的平均反应时间。

              trial 1  trial 2  trial 3  trial 4 
participant 1:   2000     1450     1800     2200

我尝试了reshape2 包中的colsplit,但这似乎没有将我的数据拆分为新列(可能是因为我的数据都在一个单元格中)。

有什么建议吗?

【问题讨论】:

    标签: r csv


    【解决方案1】:

    我认为您正在寻找 strsplit() 函数;

    a = "2000,1450,1800,2200"
    strsplit(a, ",")
    [[1]]                                                                                                                                                       
    [1] "2000" "1450" "1800" "2200"   
    

    注意 strsplit 返回一个列表,在这种情况下只有一个元素。这是因为 strsplit 将向量作为输入。因此,您还可以将单个单元格字符的长向量放入函数中,并返回该向量的拆分列表。在一个更相关的例子中,这看起来像:

    # Create some example data
    dat = data.frame(reaction_time = 
           apply(matrix(round(runif(100, 1, 2000)), 
                         25, 4), 1, paste, collapse = ","),
                         stringsAsFactors=FALSE)
    splitdat = do.call("rbind", strsplit(dat$reaction_time, ","))
    splitdat = data.frame(apply(splitdat, 2, as.numeric))
    names(splitdat) = paste("trial", 1:4, sep = "")
    head(splitdat)
      trial1 trial2 trial3 trial4
    1    597   1071   1430    997
    2    614    322   1242   1140
    3   1522   1679     51   1120
    4    225   1988   1938   1068
    5    621    623   1174     55
    6   1918   1828    136   1816
    

    最后,计算每个人的平均值:

    apply(splitdat, 1, mean)
    [1] 1187.50  361.25  963.75 1017.00  916.25 1409.50  730.00 1310.75 1133.75
    [10]  851.25  914.75  881.25  889.00 1014.75  676.75  850.50  805.00 1460.00
    [19]  901.00 1443.50  507.25  691.50 1090.00  833.25  669.25
    

    【讨论】:

    • 哇,保罗的反应很棒,反应很快,dankjewel!像魅力一样工作:) 如果我没记错的话,你也可以只使用“colMeans”和“rowMeans”而不是“apply(splitdat, 1, mean)”? PS。抱歉,我不能投票给你,显然我需要 15 声望?!
    • 你对 colMeans ofcourse 的看法是对的 :)。然而,我认为使用 apply 也很好,因为它更加灵活。 ps 你也是荷兰人吗?
    • 谢谢!是的,我也是荷兰人 :)
    【解决方案2】:

    一个漂亮的方法是使用read.csvtextConnection。假设您的数据在数据框中,df:

    x <- read.csv(textConnection(df[["reaction times"]]))
    

    【讨论】:

    • 对我来说看起来一点也不沉重。看起来很灵巧地挥舞着 R。
    • 优雅的解决方案!看看我们的解决方案在处理真正大型数据集的速度方面如何比较会很有趣。
    • 也可以完美运行(我真的可以同时批准这两种解决方案吗?)
    【解决方案3】:

    老问题,但我是从another recent question 遇到的(这似乎无关)。

    现有的两个答案都是合适的,但我想分享一个与我创建的名为“splitstackshape”的包相关的答案,该包速度快且语法简单。

    以下是一些示例数据:

    set.seed(1)
    dat = data.frame(
      reaction_time = apply(matrix(round(
        runif(24, 1, 2000)), 6, 4), 1, paste, collapse = ","))
    

    这是分裂:

    library(splitstackshape)
    cSplit(dat, "reaction_time", ",")
    #    reaction_time_1 reaction_time_2 reaction_time_3 reaction_time_4
    # 1:             532            1889            1374             761
    # 2:             745            1322             769            1555
    # 3:            1146            1259            1540            1869
    # 4:            1817             125             996             425
    # 5:             404             413            1436            1304
    # 6:            1797             354            1984             252
    

    并且,如果您需要选择rowMeans

    rowMeans(cSplit(dat, "reaction_time", ","))
    # [1] 1139.00 1097.75 1453.50  840.75  889.25 1096.75
    

    【讨论】:

    • 优秀的包——感谢分享,让它更简单!
    【解决方案4】:

    将 dplyr 和 tidyr 与 Paul Hiemstra 的示例数据一起使用的另一种选择是:

    # create example data
    data = data.frame(reaction_time = 
                         apply(matrix(round(runif(100, 1, 2000)), 
                                      25, 4), 1, paste, collapse = ","),
                 stringsAsFactors=FALSE)
    head(data)
    
    # clean data
    data2 <- data %>% mutate(split_reaction_time = str_split(as.character(reaction_time), ",")) %>% unnest(split_reaction_time) 
    data2$col_names <- c("trial1", "trial2", "trial3", "trial4")
    data2 <- data2 %>% spread(key = col_names, value = split_reaction_time) %>% select(-reaction_time)
    head(data2)
    

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 2013-02-04
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多