是否可以用列表填充数据框单元格?
这是我的代码:
input_vector <- sample(1:1000, 200)
input_vector
new_data_frame <- data.frame("Values" = numeric() , "Divisors" = numeric())
new_data_frame
for (i in input_vector) {
if (i %% 3 == 0 & i %% 7 == 0) {
new_data_frame[nrow(new_data_frame)+1, 1] <- i
new_data_frame[nrow(new_data_frame), 2] <- c(3, 7)
}
}
new_data_frame
但是,看来我无法用c(3,7)填充第二列。在没有以下行的情况下运行代码即可:
new_data_frame[nrow(new_data_frame), 2] <- c(3, 7)
此外,当我将数字3和7添加为字符串时,它也可以工作。为什么我要向数据帧中的单个单元格添加字符串,而不向矢量或列表添加字符串。
答案 0 :(得分:4)
您要使用的是称为 list-column 的内容。通常,框架中的列是向量,而不是列表,列表(除其他外)具有几个简单的属性:[
总是返回原子的事物,并且大多数在框架上进行的操作都在所有列上进行。列一旦为list
而不是vector
,则某些情况可能会有所不同。
演示:
mt <- head(mtcars)
### "set up" the third column as a list
mt[[3]] <- as.list(mt[[3]])
### while it "looks normal",
mt
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
# Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
### ... its output is obviously different
mt[,2]
# [1] 6 6 4 6 8 6
mt[,3]
# [[1]]
# [1] 160
# [[2]]
# [1] 160
# [[3]]
# [1] 108
# [[4]]
# [1] 258
# [[5]]
# [1] 360
# [[6]]
# [1] 225
在这里,您可以使用双括号符号:
mt[[2,3]] <- c(3, 7)
mt
# mpg cyl disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 3, 7 110 3.90 2.875 17.02 0 1 4 4
# Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
# Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
mt[,3]
# [[1]]
# [1] 160
# [[2]]
# [1] 3 7
# [[3]]
# [1] 108
# [[4]]
# [1] 258
# [[5]]
# [1] 360
# [[6]]
# [1] 225
一些带有未列出框架的“自然”事物将开始显示差异:
sapply(mt, class)
# mpg cyl disp hp drat wt qsec vs am gear carb
# "numeric" "numeric" "list" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric" "numeric"
colSums(head(mtcars))
# mpg cyl disp hp drat wt qsec vs am gear carb
# 123.00 36.00 1271.00 703.00 20.64 17.93 108.77 3.00 3.00 21.00 13.00
colSums(mt)
# Error in colSums(mt) : 'x' must be numeric
sapply(mt, function(a) sum(unlist(a)))
# mpg cyl disp hp drat wt qsec vs am gear carb
# 123.00 36.00 1121.00 703.00 20.64 17.93 108.77 3.00 3.00 21.00 13.00
还有许多其他的东西。
答案 1 :(得分:1)
可以这样做,但不建议这样做。 df的每一列都必须具有相同的类,因此,如果将--aot --prod
的类从数字更改为列表,则可以在其中放入任何您喜欢的内容,尽管它可能无法达到预期的效果! (如上文@ r2evans所述)