在数据框中取消列出列时出错

时间:2017-05-16 20:10:11

标签: r list dataframe

假设我有一个名为DF的数据框:

options(stringsAsFactors = F)

letters <- list("A", "B", "C", "D")
numbers <- list(list(1,2), 1, 1, 2)
score <- list(.44, .54, .21, .102)

DF <- data.frame(cbind(letters, numbers, score))

请注意,数据框中的所有列都属于&#34; list&#34;。

另外,看看结构:DF $ numbers [1]也是一个列表

我试图将每一栏都列入联合国。

 DF$letters <- unlist(DF$letters)
 DF$score <- unlist(DF$score)
 DF$numbers <- unlist(DF$numbers)

但是,因为,DF $ number [1]也是一个列表,我回过头来看这个错误:

 Error in `$<-.data.frame`(`*tmp*`, numbers, value = c(1, 2, 1, 1, 2)) : 
   replacement has 5 rows, data has 4

有没有办法可以取消整个列的列表,并将像DF $ number [1]这样的值单元格保存为字符向量,如c(1,2)或1,2?

理想情况下,我希望DF看起来像这样,数字列中的各个值仍然是int类型:

 letters   numbers   score
  A         1,2       .44
  B         1         .54
  C         1         .21
  D         2         .102

目标是将数据帧写入csv文件。

2 个答案:

答案 0 :(得分:1)

您可以将unlist应用于列数字的每个元素,而不是整列:

DF$numbers <- lapply(DF$numbers, unlist)

DF
#  letters numbers value
#1       A    1, 2 0.440
#2       B       1 0.540
#3       C       1 0.210
#4       D       2 0.102

DF$numbers[1]
#[[1]]
#[1] 1 2

如果您需要原子矢量列,请将元素粘贴为单个字符串:

DF$numbers <- sapply(DF$numbers, toString)
DF
#  letters numbers value
#1       A    1, 2  0.44
#2       B       1  0.54
#3       C       1  0.21
#4       D       2 0.102

DF$numbers[1]
#[1] "1, 2"

class(DF$numbers)
# [1] "character"

答案 1 :(得分:0)

你可以这样做:

DF$letters <- unlist(DF$letters)
DF$value <- unlist(DF$value)
DF$numbers <- unlist(as.character(DF$numbers))

返回:

DF
  letters numbers value
1       A c(1, 2) 0.440
2       B       1 0.540
3       C       1 0.210
4       D       2 0.102