r - 按原样添加矢量作为 data.frame 元素

标签 r vector dataframe

我有一个 data.frame由(最初)一个观察值组成。 从原始数据中,我有一个列表(更具体地说,一个字符向量)应该作为一个新列附加到 data.frame 并包含在一个元素中。

具体来说,我有这个 data.frame:

> str(stats.df)
'data.frame':   1 obs. of  174 variables:
 $ stat.mineBlock.minecraft.furnace              : num 1
 $ stat.useItem.minecraft.fence_gate             : num 1
 $ stat.useItem.minecraft.stone_brick_stairs     : num 3
 $ stat.killEntity.Sheep                         : num 20
 $ stat.useItem.minecraft.cobblestone            : num 18  

我想添加以下内容:

> str(stats.list$achievement.exploreAllBiomes$progress)
  chr [1:6] "Desert" "Extreme Hills" "Ocean" "Extreme Hills Edge" "River" "Hell"

这样

 > stats.df$achievement.exploreAllBiomes.progress
  [1] "Desert"             "Extreme Hills"      "Ocean"              "Extreme Hills Edge"
  [5] "River"              "Hell" 

因为 stats.list$achievement.exploreAllBiomes包含元素:value ,这是一个数字,progress , 这是一个字符向量。我想要我的 stats.df将其中的每一个包含为单独的列。

我的问题是 data.frame 扩展了字符向量的每个元素的附加行,因此 data.frame 的每一行都是相同的,并且仅在 achievement.exploreAllBiomes.progress 中有所不同。字段,其中每一行包含所述向量的一个元素。

我已经尝试了以下 3 个三件事,使用和不使用 I() :

 stats.df$achievement.exploreAllBiomes.progress        <- I(stats.list$achievement.exploreAllBiomes$progress)
 stats.df$achievement.exploreAllBiomes.progress[1]     <- I(stats.list$achievement.exploreAllBiomes$progress)
 cbind(stats.df, achievement.exploreAllBiomes.progress = I(stats.list$achievement.exploreAllBiomes$progress))

接收其中之一

 Error in `$<-.data.frame`(`*tmp*`, "achievement.exploreAllBiomes.progress",  : 
 replacement has 6 rows, data has 1

或重复行变体。 我假设 I()可以解决问题,但它似乎只在从头开始构建 data.frame 时有效,所以我尝试构建 stats.df考虑到这一点:

stats.df <- data.frame(stats.list[names(stats.list) != "achievement.exploreAllBiomes"],
                     achievement.exploreAllBiomes.value    = stats.list$achievement.exploreAllBiomes$value,
                     achievement.exploreAllBiomes.progress =  I(stats.list$achievement.exploreAllBiomes$progress))

但这又产生了重复的行。 我知道 data.frame 中的元素可能包含向量或列表,所以我认为必须有一种相当简单的方法来实现这一点,我可能只是没有看到。

最佳答案

以下是您可以如何做到这一点:

stats.df <- data.frame(stat.mineBlock.minecraft.furnace = 3, 
                       stat.useItem.minecraft.fence_gate = 5)

stats.list <- c("Desert", "Extreme Hills", "Ocean", "Extreme Hills Edge", "River", "Hell")

stats.df$achievement.exploreAllBiomes.progress <- I(list(stats.list))
stats.df$ach[[1]]

#[1] "Desert"             "Extreme Hills"      "Ocean"             
#[4] "Extreme Hills Edge" "River"              "Hell" 

str(stats.df)
#'data.frame':  1 obs. of  3 variables:
# $ stat.mineBlock.minecraft.furnace     : num 3
# $ stat.useItem.minecraft.fence_gate    : num 5
# $ achievement.exploreAllBiomes.progress:List of 1
#  ..$ : chr  "Desert" "Extreme Hills" "Ocean" "Extreme Hills Edge" ...
#  ..- attr(*, "class")= chr "AsIs"

关于r - 按原样添加矢量作为 data.frame 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23756005/

相关文章:

r - LM 和 LME 结果的标准误

c++ - 计算 vector vector 子集的最佳方法

c++ - 允许 n 维坐标的有效方法?

c++ - 在前面插入 vector

r - 将 lapply 输出保存为数据帧循环

r - 为什么当我给 R 中的两个列表元素赋予相同名称时没有错误

r - 匹配向量之间的名称并分配相应的值

r - 从文本中提取字母数字字符串

python - 如果缺少连续值,则添加 nan

python - 列出 Pandas DataFrame - Python 3.x