2017-12-21 36 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 = "~"); do.call (bind_rows, lapply (split dff, dff $ A), function (x) {data.frame (A = head (x $ A, 1), B = seq (min (x $ B), max 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) 

이 솔루션에는 세 부분이 있습니다. 먼저 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 식을 포함하는 문자열을 생성 할 수 있다면, 당신은 다음 그들을 평가할 수 있다는 것이다 "평가 (구문 분석())"...이 같은

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

또는 map() 호출에 원래 "x ~ y"문자열을 가져오고 원하는 정수 벡터를 반환하는 함수를 호출 할 수는 있지만이 솔루션은 최소한으로 입력해야한다고 생각합니다.

그러나 이제 모든 관찰이 정수 벡터 인 B 열이 생겼습니다.

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

마지막 단계는 tidyr 함수를 사용하여 B에서 벡터를 제외시키고 unnest합니다. 그러면 필요에 따라 행의 열 값이 자동으로 반복됩니다.

> 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