用向量填充数据框单元格

时间:2019-10-31 21:46:42

标签: r

是否可以用列表填充数据框单元格?

这是我的代码:

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添加为字符串时,它也可以工作。为什么我要向数据帧中的单个单元格添加字符串,而不向矢量或列表添加字符串。

2 个答案:

答案 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所述)