我有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
字段中有所不同,其中每行包含所述向量的一个元素。
我尝试了以下三个方面,使用和不使用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中的一个元素可能包含一个向量或列表,所以我认为必须有一种相当简单的方法来实现这一点,我可能只是没有看到。
答案 0 :(得分:2)
以下是你如何做到这一点:
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"