2011-02-09 9 views
3

안녕하세요 쉼표로 구분 된 열이있는 표가 있고 쉼표로 구분 된 값을 새 행으로 변환해야합니다. exmaple을 위해 주어진 표는 내가새 행으로 쉼표로 구분 된 셀 구분

Name Start End 
    A  1 4 
    A  2 5 
    A  3 6 
    B  1 4 
    B  2 5 
    C  1 6 
    C  2 7 
    C  3 8 
    C  4 9 
내가 할 수있는

처럼 변환해야

Name  Start  End 
A  1,2,3 4,5,6 
B   1,2  4,5 
C  1,2,3,4 6,7,8,9 

입니다 VB 스크립트를 사용하지만 난 그게 사람이이 문제를 해결 할 수 R 를 사용하여 해결해야합니까?

+2

이 질문은하지 여기서, R 언어 서버에 속하는 ... 여러 구분 된 값으로 관측 보스입니다. – whuber

+0

read.csv로 파일을 읽고 write.table로 작성하고, melt로 적절한 형식으로 변환하십시오. 이 질문은 가장 최근의 질문과 유사합니다. 실제로 여기에 속하지 않습니다. stackoverflow에서 물어보십시오. – mpiktas

+0

오케이. 저는 R이 CV가 R 커뮤니티라고 생각하는 사람들에게 새로운 사람입니다. 다음에 그것을 따라갈 것입니다 :) – Jana

답변

2

다음은 유용한 접근 방식입니다. 3 개의 입력 벡터가 다른 객체에 있다고 가정합니다. 우리는 이러한 입력 목록을 작성하고 각 객체를 처리하는 함수를 작성하여 data.frame plyr 형식으로 반환합니다.

여기서 주목해야 할 점은 문자 벡터를 구성 요소 파트로 분할 한 다음 as.numeric을 사용하여 분할 할 때 문자 양식에서 숫자를 변환하는 것입니다. R은 행렬로 행렬을 채우므로 2 열 행렬을 정의하고 R이 우리에 대한 값을 채우도록합니다. 그런 다음 이름 열을 검색하여 모두 data.frame에 넣습니다. plyr은 목록을 처리하고이를 자동으로 data.frame으로 변환하기에 충분히 좋습니다.

library(plyr) 

a <- paste("A",1, 2,3,4,5,6, sep = ",", collapse = "") 
b <- paste("B",1, 2,4,5, sep = ",", collapse = "") 
c <- paste("C",1, 2,3,4,6,7,8,9, sep = ",", collapse = "") 

input <- list(a,b,c) 

splitter <- function(x) { 
    x <- unlist(strsplit(x, ",")) 
    out <- data.frame(x[1], matrix(as.numeric(x[-1]), ncol = 2)) 
    colnames(out) <- c("Name", "Start", "End") 
    return(out) 
} 


ldply(input, splitter) 

그리고 출력 : 당신은 통계 :) 어쨌든

처리에는 문제가 없기 때문에 SO에이 질문을했을 수도

> ldply(input, splitter) 
Name Start End 
1 A  1 4 
2 A  2 5 
3 A  3 6 
4 B  1 4 
5 B  2 5 
6 C  1 6 
7 C  2 7 
8 C  3 8 
9 C  4 9 
3

, 나는 만들어 아주 복잡하고 추한 당신을 위해 일할 수있는 해결책 :

# load your data 
x <- structure(list(Name = c("A", "B", "C"), Start = c("1,2,3", "1,2", 
"1,2,3,4"), End = c("4,5,6", "4,5", "6,7,8,9")), .Names = c("Name", 
"Start", "End"), row.names = c(NA, -3L), class = "data.frame") 

R에 추천하기 추천 :

data <- data.frame(cbind(
    rep(x$Name,as.numeric(lapply(strsplit(x$Start,","), length))), 
    unlist(lapply(strsplit(x$Start,","), cbind)), 
    unlist(lapply(strsplit(x$End,","), cbind)) 
    )) 

새로운 데이터 프레임을 명명 : strsplit 전화의 도움으로

> x 
    Name Start  End length 
1 A 1,2,3 4,5,6  3 
2 B  1,2  4,5  2 
3 C 1,2,3,4 6,7,8,9  4 

데이터 변환을

> data 
    Name Start End 
1 A  1 4 
2 A  2 5 
3 A  3 6 
4 B  1 4 
5 B  2 5 
6 C  1 6 
7 C  2 7 
8 C  3 8 
9 C  4 9 
:처럼 보이는

names(data) <- c("Name", "Start", "End") 

+0

"나는 당신을 위해 일할 수도있는 매우 복잡하고 추악한 솔루션을 만들었습니다."나를 미소 짓게 해주셔서 감사합니다. ;-) –

+0

@ Joshua Ulrich : 내 대답은 좋은 결과를 얻었습니다. :) – daroczig

0

여기에 그냥 재미를위한 것입니다. 원래 데이터로 d을 가져 가십시오. tidyr에서

f <- function(x, ul = TRUE) 
{ 
    x <- deparse(substitute(x)) 
    if(ul) unlist(strsplit(d[[x]], ',')) 
    else strsplit(d[[x]], ',') 
} 

> data.frame(Name = rep(d$Name, sapply(f(End, F), length)), 
      Start = f(Start), End = f(End)) 
# Name Start End 
# 1 A  1 4 
# 2 A  2 5 
# 3 A  3 6 
# 4 B  1 4 
# 5 B  2 5 
# 6 C  1 6 
# 7 C  2 7 
# 8 C  3 8 
# 9 C  4 9 
1

separate_rows() 기능은

# create data 
library(tidyverse) 
d <- data_frame(
    Name = c("A", "B", "C"), 
    Start = c("1,2,3", "1,2", "1,2,3,4"), 
    End = c("4,5,6", "4,5", "6,7,8,9") 
) 
d 
# # A tibble: 3 x 3 
# Name Start  End 
# <chr> <chr> <chr> 
# 1  A 1,2,3 4,5,6 
# 2  B  1,2  4,5 
# 3  C 1,2,3,4 6,7,8,9 

# tidy data 
separate_rows(d, Start, End) 
# # A tibble: 9 x 3 
# Name Start End 
# <chr> <chr> <chr> 
# 1  A  1  4 
# 2  A  2  5 
# 3  A  3  6 
# 4  B  1  4 
# 5  B  2  5 
# 6  C  1  6 
# 7  C  2  7 
# 8  C  3  8 
# 9  C  4  9 

# use convert set to TRUE for integer column modes 
separate_rows(d, Start, End, convert = TRUE) 
# # A tibble: 9 x 3 
# Name Start End 
# <chr> <int> <int> 
# 1  A  1  4 
# 2  A  2  5 
# 3  A  3  6 
# 4  B  1  4 
# 5  B  2  5 
# 6  C  1  6 
# 7  C  2  7 
# 8  C  3  8 
# 9  C  4  9