【问题标题】:Add vector as data.frame element as is按原样添加向量作为 data.frame 元素
【发布时间】:2014-07-08 11:47:13
【问题描述】:

我有一个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 中的元素可能包含向量或列表,所以我认为必须有一种相当简单的方法来实现这一点,而我可能只是没有看到。

【问题讨论】:

  • 另外,对于那些想知道的人:我正在尝试将 Minecraft 玩家统计数据(包含在 JSON 文件中)转换为 R 对象,这样我就可以轻松地构造一个 data.frame,每个观察都是玩家在服务器上,然后将其用于恶作剧。我想将统计信息作为列表使用是可能的,但 data.frame 对我来说更方便,尤其是考虑到绘图。

标签: r vector dataframe


【解决方案1】:

您可以这样做:

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"

【讨论】:

  • 谢谢,差不多了。我刚刚意识到,无论如何我当然需要对progress 列进行子集化,这意味着stats.df$achievement.exploreAllBiomes.progress 无论如何都必须是列表列表,或多或少(如果这有意义的话)。 TL;DR 这很好用,我会在几个小时内将其标记为已接受,除非有人发布纯粹的魔法答案(即使我怀疑它是否可以改进)。
  • @Jemus42 是的,我想在我的回答中解决该结构的不便,但后来决定切入正题。顺便说一句,我从未见过有人将 R 用于 Minecraft。听起来很酷!
  • 它是marvellous!。当我二月份开始学习 R 时,Minecraft 是更有趣的目标之一 :)
  • 我喜欢你为你的服务器呈现stats 的方式,非常整洁!我见过的 R+shiny+ggplot2 最有趣的用法之一。
  • 哈哈,可惜statspage与R无关。It's all a bunch of javascript,而且都是其他服务器成员写的:)
猜你喜欢
  • 2021-04-19
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多