2013-09-24 49 views
0

下面的列表是一个例子:使用grep结果 - 返回值

a.df<-data.frame(a1=c("A,B,C", NA, "A,B,C","",NA, "B,C")) 
grep(pattern="B", x=a.df$a1, value=FALSE) 
b<-sapply(X=a.df$a1, FUN=grep, pattern="B", value=FALSE) 
a.df$b1<-b 

看着a.df,你有这样的印象,这是一个“正常” data.frame

a.df 

    a1 b1 
1 A,B,C 1 
2 NA integer(0) 
3 A,B,C 1 
4  integer(0) 
5 NA integer(0) 
6 B,C 1 

但是,当您详细查看$ b1时,可以看到值列表仍然存在。

a.df$b1 

[[1]] 
[1] 1 

[[2]] 
integer(0) 

[[3]] 
[1] 1 

[[4]] 
integer(0) 

[[5]] 
integer(0) 

[[6]] 
[1] 1 

所以,当您尝试保存a.df

write.csv(a.df, file="a_df.csv") 

您会收到以下错误:

Error in .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol, : 
    unimplemented type 'list' in 'EncodeElement' 

的快捷方法的几点思考data.frame列来解决这个列表问题,将不胜感激?我想我只是在这里错过了一些基本的类型转换或类似的命令,但我似乎被卡在这里。

回答

2

这基本上实现了你想要的。 grepl返回一个逻辑向量,就可以转换为0和1与as.numeric或乘以1或0添加

a.df <- data.frame(a1=c("A,B,C", NA, "A,B,C","",NA, "B,C")) 
a.df$b1 <- as.numeric(grepl("B",a.df$a1)) 

> a.df 
    a1 b1 
1 A,B,C 1 
2 <NA> 0 
3 A,B,C 1 
4  0 
5 <NA> 0 
6 B,C 1 

write.csv(a.df,"example.csv") 

的问题,你的代码,当grep没有找到一个“B”,它返回一个空向量。例如:

> grep("a",c("b","c")) 
integer(0) 

所以,当你添加grep结果到数据帧的数据帧将它们存储为一个列表,因为grep的返回该细胞的载体没有“B”。

如果你真的需要细胞a.df $ B1,你可以这样做:

a.df$b1 <- grepl("B",a.df$a1) 
a.df$b1 <- ifelse(a.df$b1,1,"") 
#Or in one line as: a.df$b1 <- ifelse(grepl("B",a.df$a1),1,"") 

> a.df 
    a1 b1 
1 A,B,C 1 
2 <NA> 
3 A,B,C 1 
4   
5 <NA> 
6 B,C 1