2016-07-23 59 views
0

道歉,如果这很明显,我发现什么时候有索引或什么时候缺少列。但我不认为任何一方都会为此工作。通过将列与缺少数据的列表组合在一起制作数据框,strsplit,没有索引

实施例的数据:

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" 

我的目标是一个数据帧:

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 

我想列A为基准,但是它不具有唯一的值。但是,它具有每个列表允许的最大值(我希望这是有道理的)。因此,应删除C列表1中的第五个值,即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]] A列中字符串元素这可以用一个初始strsplit()调用来完成的字段长度,然后取lengths()

然后,我们可以使用lapply()遍历所有列并将它们拆分为strsplit()。为了确保我们根据列A的控制长度限制每个拆分字符串向量,我们必须将每个拆分字符串向量从1索引到列A的长度,索引向量通过seq_len()计算。这可以通过使用Map()并行迭代分割字符串向量和预计算长度向量来完成。索引分割字符串矢量可以方便地完成两件事:(1)限制长度,(2)为当前列的分割字符串向量中未表示的拖尾索引返回NA。我们终于可以得到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) 
相关问题