&引用;“嵌入式”;R中的data.frame。它是什么,它叫什么,为什么它的行为方式是这样的?

&引用;“嵌入式”;R中的data.frame。它是什么,它叫什么,为什么它的行为方式是这样的?,r,dataframe,nested,R,Dataframe,Nested,我在R中有以下数据结构: df <- structure( list( ID = c(1L, 2L, 3L, 4L, 5L), var1 = c('a', 'b', 'c', 'd', 'e'), var2 = structure( list( var2a = c('v', 'w', 'x', 'y', 'z'), var2b = c('vv', 'ww', 'xx', 'yy', 'zz')), .Nam

我在R中有以下数据结构:

df <- structure(
  list(
    ID = c(1L, 2L, 3L, 4L, 5L),
    var1 = c('a', 'b', 'c', 'd', 'e'),
    var2 = structure(
      list(
        var2a = c('v', 'w', 'x', 'y', 'z'),
        var2b = c('vv', 'ww', 'xx', 'yy', 'zz')),
      .Names = c('var2a', 'var2b'),
      row.names = c(NA, 5L),
      class = 'data.frame'),
    var3 = c('aa', 'bb', 'cc', 'dd', 'ee')),
  .Names = c('ID', 'var1', 'var2', 'var3'),
  row.names = c(NA, 5L),
  class = 'data.frame')

# Looks like this:
#   ID var1 var2.var2a var2.var2b var3
# 1  1    a          v         vv   aa
# 2  2    b          w         ww   bb
# 3  3    c          x         xx   cc
# 4  4    d          y         yy   dd
# 5  5    e          z         zz   ee
我的问题是:

1) 这是什么? 我以前从未遇到过这种情况。对于你们中的一些人来说,这是一种常见的格式吗?什么是潜在的用例

2) 这叫什么? 我称之为“嵌入式”,因为没有更好的词。有人建议使用“嵌套”,但我认为这是不对的,请参见下面带有
tidyverse
tibble
s的单独部分

3) 为什么允许这样做? 我本以为上面的
结构
命令会失败,因为我认为data.frames本质上是列表,其中每个元素(列)具有相同数量的元素(行)。在本例中,此规则似乎被违反,因为
var2
具有
length=2
(列数!)。然而,子集
df
以通常的方式取得了惊人的成功:

df[3,]
#   ID var1 var2.var2a var2.var2b var3
# 3  3    c          x         xx   cc
发生什么事了


我不认为我可以称之为“嵌套”结构,该术语用于嵌套的
数据。帧的外观和行为如下:

library(tidyverse)
df <- data_frame(
  x = c(1L, 2L, 3L),
  nested = list(data_frame(x = c('a', 'b', 'c')), 
                data_frame(x = c('a', 'b', 'c')), 
                data_frame(x = c('d', 'e', 'f'))))
unnest(df)
# # A tibble: 9 × 2
#       x     x
#   <int> <chr>
# 1     1     a
# 2     1     b
# 3     1     c
# 4     2     a
# 5     2     b
# 6     2     c
# 7     3     d
# 8     3     e
# 9     3     f
库(tidyverse)

df我认为结构很清楚

str(df)
# 'data.frame':   5 obs. of  4 variables:
#  $ ID  : int  1 2 3 4 5
#  $ var1: chr  "a" "b" "c" "d" ...
#  $ var2:'data.frame':   5 obs. of  2 variables:
#   ..$ var2a: chr  "v" "w" "x" "y" ...
#   ..$ var2b: chr  "vv" "ww" "xx" "yy" ...
#  $ var3: chr  "aa" "bb" "cc" "dd" ...
这是一个data.frame,其中包含一个data.frame的列(
var2
)。这不是非常容易创建的,所以我不太确定您是如何创建的,但在R中它在技术上并不“非法”

data.frames可以包含矩阵和其他data.frames。因此,它不仅要查看元素的
length()
,还要查看元素的
dim()
,以查看其是否具有正确的“行数”

我经常使用

fixed <- do.call("data.frame", df)

修正了关于这个名字的想法吗?除了“一个坏主意”?不是真的。我觉得如果它不能与
write.table
一起工作,那么它就不是一个“真正的”data.frame。
data.frame()
构造函数试图避免这种情况,您可以看到,它通常是以某种“不自然”的方式创建的。我是从一个
JSON
中获得它的,请参见我前面的问题:这是尝试在不兼容的数据格式之间自动转换的副作用。Data.frames需要漂亮的矩形输入,比如来自CSV文件的输入。JSON可以存储没有任何列要求的疯狂嵌套对象。提出一个没有任何意义的JSON对象作为data.frame并不难。您应该按照另一个答案中的建议使用
flatte=T
。遗憾的是,您并不总能选择数据源。另外,csv区域与excel地狱相邻;)。上一个问题解决了我的问题,这个问题是关于更好地理解嵌入
数据的这种现象。frame
一列
数据。frame
可以是
矩阵。例如:
df$matcol它没有正式名称。R data.frames不能很好地处理嵌入列表。看看这些年来由于人们试图在数据帧中“嵌入”POSIXlt对象而引起的所有帖子。共识是明确的。。。。不需要。如果需要在列表中使用列表,请为其创建一个类名,并提供适当的功能,但不要将其称为“data.frame”。叫它别的名字,让它成为S4。你应该修复或压扁这样一个讨厌的东西,而不是尊重它。给MrFlick一些要点,然后继续做一些有用的事情。
fixed <- do.call("data.frame", df)