2011-12-11 47 views
10

我有一个包含多列的数据集,其中一列是反应时间列。这些反应时间用逗号分隔以表示不同试验的反应时间(相同参与者的反应时间)。将逗号分隔的条目转换为列

例如:行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 

我尝试了“colsplit”,从“reshape2” -package但这似乎并没有拆我的数据到新的列(也许是因为我的数据全在1个细胞)。

有什么建议吗?

回答

17

我认为你正在寻找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 
+0

哇,伟大而快速的回应保罗,dankjewel!工作就像一个魅力:) 如果我没有弄错,你也可以使用“colMeans”和“rowMeans”,而不是'apply(splitdat,1,mean)'? PS:对不起,我不能投票给你,显然我需要15声望?! – user1092247

+0

你是对的课程:)。但我认为使用apply也很好,因为它更灵活。你是否也来自荷兰? –

+0

谢谢!是的,我也来自荷兰:) – user1092247

8

一记漂亮的,如果比较重手,方法是结合使用read.csvtextConnection。假设你的数据在一个数据帧,df

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

根本不看重我。看起来很灵巧,触手可及。 –

+0

优雅的解决方案!看看我们的解决方案如何在速度方面比较真正的大数据集,会很有趣。 –

+0

也可以完美运行(我真的可以批准这两个解决方案吗?) – user1092247

6

老问题,但我碰到它another recent question(这似乎无关)。

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

下面是一些样本数据:

这是分裂:

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 
+0

优秀的软件包 - 感谢分享,使它更简单明了! – user1092247

2

另一种选择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) 
相关问题