2017-12-21 21 views
0

列内の各観測値が "x〜y"という形式の文字列である場合、xとyは整数です。データフレーム内の文字列をベクトルに変換してデータフレームをネスト解除する

「x〜y」文字列を、整数xで始まり整数yで終わる数字のシーケンスであるベクトルc(x..y)に変換することです。

最後に、ベクトルの各要素が独自の行を取得し、他の列が適切に繰り返されるように、データフレームをネストしないようにする必要があります。

例えば、ここではデータフレームです:

A  B 
A1 -1~1 
A2 1~3 
A3 2~4 

上記のデータフレームは、次のように変更する必要がありますがたくさんあるよう

A  B 
    A1 -1 
    A1 0 
    A1 1 
    A2 1 
    A2 2 
    A2 3 
    A3 2 
    A3 3 
    A3 4 

str_replaceの例を設定することは不可能ですケース。 このコードを作成するにはどうすればよいですか?

+0

'dff < - separate_rows(df、B、sep ="〜 "); (B $)、B(B $)、B(B $)、B(B $) x $ B)))}) 'はこれと関係があります。 – Abdou

答えて

1

あなたのB列は、あなたが望むものを与える式に簡単に変換できるので、私は以下のアプローチを使用します。

# Using tidyverse for stringr (str_replace), tidyr (unnest), and purrr (map) 
library(tidyverse) 

# recreating your dataframe 
df <- data.frame(A=c("A1","A2","A3"),B=c("-1~1","1~3","2~4"), stringsAsFactors = FALSE) 

このソリューションには3つの部分があります。まず、B列の行をseq式に変換します。したがって、 "x〜y"は "seq(x、y、by = 1)"になります。 Rについての素晴らしい事の

df$B <- str_replace(df$B,"\\~",",") 
df$B <- paste("seq(",df$B,",by=1)") 

一つあなたがRの表現を含む文字列を生成することができれば、あなたは、このような「のeval(パース())」でそれらを評価することができるということです...

df$B <- map(df$B, ~ eval(parse(text=.))) 

また、元の "x〜y"文字列を取り、必要な整数のベクトルを返す関数をmap()関数に与えることもできますが、この解決法は最小の型付けをしていると思います。

しかし、ここでは各観測値が整数ベクトルであるB列があります。

> df 
    A  B 
1 A1 -1, 0, 1 
2 A2 1, 2, 3 
3 A3 2, 3, 4 

最後のステップでは、tidyr関数unnestを使用してB内のベクトルのネストを解除します。これにより、必要に応じて行の列の値が自動的に繰り返されます。

> df <- unnest(df) 
> df 
    A B 
1 A1 -1 
2 A1 0 
3 A1 1 
4 A2 1 
5 A2 2 
6 A2 3 
7 A3 2 
8 A3 3 
9 A3 4 
関連する問題