关于r:将逗号分隔的字符串转换为数字列

Convert comma separated string to numeric columns

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

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

1
2
reaction_times
2000,1450,1800,2200

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

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

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

我尝试使用reshape2包中的colsplit,但这似乎并未将我的数据拆分为新的列(可能是因为我的数据全部在1个单元格中)。

有什么建议么?


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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 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

最后,计算每人的均值:

1
2
3
4
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


一个不错的方法(如果比较笨拙)是将read.csvtextConnection结合使用。假设您的数据在数据帧df中:

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


旧问题,但我从另一个新问题(似乎无关)中找到了它。

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

以下是一些示例数据:

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

这是分裂:

1
2
3
4
5
6
7
8
9
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

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


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

1
2
3
4
5
6
7
8
9
10
11
12
# 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)