【发布时间】:2018-08-16 17:38:47
【问题描述】:
下面的代码 sn-p 将一对向量转换为一个数据框,沿途填充一列表示出处(“状态”),另一列表示类型(“成分”)。
overflow <- setdiff(c(21, 23, 27), c(21, 23))
underflow <- setdiff(c(11, 13, 17), c(17))
dfo <- data.frame("State"="over", Value=overflow)
dfu <- data.frame("State"="under", Value=underflow)
df <- rbind(dfo, dfu)
df$Ingredient <- "Beans"
有了给定的数据,一切都很好。我们得到以下数据框。
> df
State Value Ingredient
1 over 27 Beans
2 under 11 Beans
3 under 13 Beans
但这对于setdiff 产生空向量时的边界情况还不够好(例如:underflow <- setdiff(c(11, 13, 17), c(11, 13, 17))。
在处理空向量的情况下,如何从向量构建数据框?携带“数据框为空”标志的选项将是一个糟糕的选项,因为代码中会充斥着if 语句。
更新
代替对@AndS. 建议的评论:
用dplyr::data_frame 替换data.frame 效果很好。至少最初。但是插入一列仍然存在问题。如果overflow 和underflow 都是空列表,则df$Ingredient <- "Beans" 失败。
【问题讨论】:
-
尝试
dplyr::data_frame而不是data.frame这将使观察数据帧为零而不是引发错误。 -
使用
library(data.table),你可以初始化一些东西dt <- data.table(State = character(), Value = numeric(), Ingredient = character())工作正常。或者,空的data.table将从您上面列出的参数继承名称,因为 R 对象类型被传递。 -
@AndS。您的解决方案几乎可以工作。我更新了问题。
-
没问题,坚持使用 dplyr,而不是
df$Ingredient <- "Beans",在mutate中分配变量。例如:df <- rbind(dfo, dfu) %>% mutate(Ingredient = "Beans")这仍然会使您成为零观察数据框,但现在有一个额外的列并且没有错误。如果有任何观察,“beans”将被添加到新列中。
标签: r dataframe vector empty-list