3

こんにちは私はコンマで区切られた列を持つテーブルを持っています、そして私はコンマで区切られた値を新しい行に変換する必要があります。たとえば、与えられたテーブルは

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

私はそれを次のように変換する必要があります

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

VBスクリプトを使用してそれを行うことはできますが、Rを使用して解決する必要があります。誰かがこれを解決できますか?

4

4 に答える 4

3

統計を扱うのに問題がないので、 SOでこの質問をしたかもしれません:)

とにかく、私はあなたのために働くかもしれない非常に複雑で醜い解決策を作りました:

# 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のように見えます:

> 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

strsplit呼び出しを利用したデータ変換:

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))
    ))

新しいデータフレームに名前を付ける:

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

これは次のようになります:

> 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
于 2011-02-09T19:29:49.670 に答える
2

これがあなたのために働くはずのアプローチです。3つの入力ベクトルが異なるオブジェクトにあると想定しています。data.frameこれらの入力のリストを作成し、各オブジェクトを処理して、それらをwithplyrの形式で返す関数を記述します。

ここで注意すべきことは、文字ベクトルをその構成要素に分割し、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)

そして出力:

> 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
于 2011-02-09T19:26:27.087 に答える
1

separate_rows()関数tidyrは、複数の区切り値を持つ観測のボスです。

# 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
于 2017-06-15T07:00:25.747 に答える
0

楽しみのために、もう1つあります。d元のデータとして取ります。

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
于 2014-05-23T05:19:41.860 に答える