0

这是一个例子:

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

但是,当您详细查看 a$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 列问题中此列表的快速方法的一些想法,将不胜感激?我想我只是在这里缺少一些基本的类型转换或类似的命令,但我似乎被困在这里。

4

1 回答 1

2

这基本上完成了你想要的。grepl返回一个逻辑向量,您可以as.numeric通过乘以 1 或加 0 将其转换为 0 和 1。

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
于 2013-09-24T21:25:46.603 回答