2016-07-23 3 views
0

謝罪これが明らかな場合は、インデックスが存在する場合や列がない場合に何かを発見しました。しかし、私はどちらもこれのために働くとは思わない。インデックスを持たないリストstrsplitと列を組み合わせてデータフレームを作成する

例のデータ:しかし、それは一意の値を持っていない、私は列Aを参照になりたい

A B C D 
n n n NA 
n y y NA 
y y y NA 
n n n NA 
t NA t NA 
j k j k 
k k k k 
k k j j 

df.test=data.frame(A=c("n,n,y,n" ,"t", "j,k,k") 
        ,B=c("n,y,y,n" ,"" , "k,k,k") 
        ,C=c("n,y,y,n,n","t", "j,k,j") 
        ,D=c(""   ,"" , "k,k,j") 
        ) 

df.test=lapply(df.test, function(x) as.character(x)) 
str(df.test) # looks similar to my data 

List of 4 
$ A: chr [1:3] "n,n,y,n" "t" "j,k,k" 
$ B: chr [1:3] "n,y,y,n" "" "k,k,k" 
$ C: chr [1:3] "n,y,y,n,n" "t" "j,k,j" 
$ D: chr [1:3] "" "" "k,k,j" 

私の目的は、データフレームです。ただし、各リストから許可される最大値があります(意味があることを望みます)。したがって、Cリスト1の5番目の値を削除する必要があります。つまり、n y y n n -> n y y nです。 また、欠損値を追加する必要があります(列Aに従って欠落)。 Cの余分な値は他のソフトウェアのバグです(これ以上の影響はありません)。これらの余計な値以外は、互いに対応しています。例えば、tは同じ行になければなりません(存在する場合)。

私がこれまでにやったことは、ベクトルのリストを作ることです。リストの長さが異なるので、それらをまとめることができず、対応しません。

df3=lapply(df.test, function(x) unlist(strsplit(x,','))) 
str(df3) 

List of 4 
$ A: chr [1:8] "n" "n" "y" "n" ... 
$ B: chr [1:7] "n" "y" "y" "n" ... 
$ C: chr [1:9] "n" "y" "y" "n" ... 
$ D: chr [1:3] "k" "k" "j" 

答えて

1

あなたは、列Aが支配したいので、私たちは、最初にこれはdf.test[[1L]]に初期strsplit()呼び出しで行われ、その後、lengths()を取ることができ、列Aの文字列要素のフィールド長を事前に計算することができます。

次に、lapply()を使用してすべての列を繰り返し、strsplit()で分割することができます。列Aの支配長に従って各分割文字列ベクトルを確実に上書きするには、各分割文字列ベクトルを1からA列の長さにインデックスし、インデックスベクトルをseq_len()で計算する必要があります。これは、Map()を使用して、分割文字列ベクトルと事前計算された長さベクトルの両方を並列に反復処理するために実行できます。分割文字列ベクトルを索引付けすると、(1)長さを上書きし、(2)現在の列の分割文字列ベクトルで表されていないテイリング索引に対してNAを返すという2つのことが便利です。最終的にはunlist()の分割文字列ベクトルの結果リストを使用して単一の列ベクトルを取得し、as.data.frame()にすべてをラップしてリストをdata.frameに強制することができます。

ls1 <- lengths(strsplit(df.test[[1L]],',')); 
as.data.frame(lapply(df.test,function(x) 
    unlist(Map(function(ss,l) ss[seq_len(l)],strsplit(x,','),ls1)) 
),stringsAsFactors=F); 
## A B C D 
## 1 n n n <NA> 
## 2 n y y <NA> 
## 3 y y y <NA> 
## 4 n n n <NA> 
## 5 t <NA> t <NA> 
## 6 j k j k 
## 7 k k k k 
## 8 k k j j 
+0

ワウ。私はそのようなものを考え出すのは遠いです。サンプルデータと実際のデータを処理しました。私はネストされたループを動作させることができましたが、私はそれを使う必要はありません。どうもありがとう。 – john

0

上記のbgoldstの回答を参照してください。

以下は、私が思いついたことです。それは誰にとっても大丈夫です。それは実際のデータではなく、サンプルデータで動作しますが、はるかに優れた回答が投稿された理由を調べています。

もう一度おねがいします。

df6=lapply(df.test, function(x) strsplit(x,',')) 

    df7=data.frame() 
    df7=lapply(df7, function(x) as.character(x)) 

    for (i in 1:length(df6$A)){ 
    for (ii in 1:length(df6$A[[i]])){ 
     df7=rbind(df7,sapply(df6,function(x) x[[i]][ii])) 
    } 
    } 

    str(df7) 

    print(df7) 
関連する問題