【发布时间】: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 对我来说更方便,尤其是考虑到绘图。