2011-12-11 23 views
10

私はいくつかの列を持つデータセットを持っています。そのうちの1つは反応時間の列です。これらの反応時間は、異なる試行の(同じ参加者の)反応時間を示すためにコンマで区切られている。例えばコンマで区切られた項目を列に変換する

:行1(すなわち:参加者1からのデータ)は、これらしたがってカラム「反応時間」

reaction_times 
2000,1450,1800,2200 

下以下た試験1,2,3,4ための参加者1の反応時間です。

これらのトライアルの反応時間がすべて個々の列を形成する新しいデータセットを作成したいと考えています。この方法で、それぞれの平均反応時間を計算することができます試験

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

私は「reshape2」-packageから「colsplit」を試してみましたが、それは(私のデータはすべて1つのセルであるなどの理由で)新しい列に私のデータを分割していないようです。

提案がありますか?

答えて

17

私はあなたがstrsplit()関数を探していると思います。

strsplitはリストを返します。この場合、要素は1つだけです。これは、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

すごく素早いレスポンスPaul、dankjewel!魅力のように動作します:) 私が間違っていない場合は、「apply(splitdat、1、mean)」の代わりに「colMeans」と「rowMeans」を使用することもできます。 PS。申し訳ありません私はあなたを投票することはできません、明らかに私は最初に15の評判が必要ですか? – user1092247

+0

あなたは本来のコルマンについて:)。しかし、私はapplyを使うことはずっと柔軟だからいいと思う。 psオランダ出身ですか? –

+0

ありがとう!はい、私もNLから来ています:) – user1092247

8

を気の利いた、かなり強引であれば、方法はと一緒にread.csvを使用することですtextConnection

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

私には重い手が見えません。巧みなタッチでRを揺さぶるように見える。 –

+0

エレガントなソリューション!実際の大規模なデータセットの速度に関して私たちのソリューションがどのように比較されているかを調べることは興味深いでしょう。 –

+0

また完璧に動作します(実際に両方を解決策として承認できますか?) – user1092247

6

古い質問は、私は(無関係と思われる)another recent questionから渡って来た:あな​​たのデータは、データフレーム、dfであると仮定します。

既存の回答はどちらも適切ですが、作成した「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) 
関連する問題