假设我有一个名为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文件。
答案 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