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論理ベクトルを返します。これは、1 をas.numeric掛けたり、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 に答える