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

时间:2014-05-20 09:32:16

标签: 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字段中有所不同,其中每行包含所述向量的一个元素。

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

1 个答案:

答案 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"