Convert comma separated string to numeric columns
我有一个包含几列的数据集,其中一列是反应时间的列。 这些反应时间以逗号分隔,以表示不同试验的(同一参与者的)反应时间。
例如:第1行(即:来自参与者1的数据)在"反应时间"列下具有以下内容
1 2 | reaction_times 2000,1450,1800,2200 |
因此,这些是参与者1对试验
我现在想创建一个新的数据集,其中这些试验的反应时间全部形成单独的列。 这样,我可以计算出每个试验的平均反应时间。
1 2 | trial 1 trial 2 trial 3 trial 4 participant 1: 2000 1450 1800 2200 |
我尝试使用
有什么建议么?
我认为您正在寻找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 |
一个不错的方法(如果比较笨拙)是将
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 |
并且,可选地,如果您需要使用
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) |