【问题标题】:Operations on data frame with a variable containing vectors使用包含向量的变量对数据框进行操作
【发布时间】:2013-06-07 13:09:51
【问题描述】:

当我创建一个数据框时,其中一个变量包含一个整数向量,例如

id <- 1:5
meas <- list(NA,c(1,2),c(1),c(1,2,3),c(1,2,3,4))
myDf <- data.frame(cbind(id,meas))

我可以轻松地将向量复制到另一个变量中或检查它是否包含 NA

myDf$copyMeas <- myDf$meas
myDf$naMeas <- is.na(myDf$meas)

但是当我想获得向量的长度时,我会获得数据框中的观察次数

myDf$lengthMeas <- length(myDf$meas)

  id       meas   copyMeas naMeas lengthMeas
1  1         NA         NA   TRUE          5
2  2       1, 2       1, 2  FALSE          5
3  3          1          1  FALSE          5
4  4    1, 2, 3    1, 2, 3  FALSE          5
5  5 1, 2, 3, 4 1, 2, 3, 4  FALSE          5

为什么会出现这种行为?当我想要另一个变量中向量的长度时应该使用什么?

【问题讨论】:

  • 你有一个列表列表的data.frame(它本身就是一个列表)。 R 中的这种结构称为probably.looking.for.trouble
  • 呸,列表(列表中(列表中(甚至可能是(更多)列表中)))很好。你只需要确保你有(足够的(和必要的))括号(任何类型的)(有时(但不总是)嵌套的)方便。

标签: r vector dataframe


【解决方案1】:

因为该列是一个列表。如果您询问列表的长度,您将得到它有多少个元素。您似乎想要每个元素的长度:

sapply(myDf$meas,length)
[1] 1 2 1 3 4

【讨论】:

    【解决方案2】:

    这就是诀窍:

    sapply(myDf$meas, length)
    [1] 1 2 1 3 4
    

    length 未矢量化,它假定您想要放入其中的对象的长度。使用sapply,您强制为myDf$meas 中的每个条目完成length

    【讨论】:

      【解决方案3】:

      看看

      str(myDf)
      

      您会看到myDf$meas 仍然是list。相应地,length(myDf$meas) 的结果就是这个列表的长度,即 5。

      你正在寻找

      myDf$lengthMeas <- sapply(myDf$meas, length).
      

      【讨论】:

      • 我的误解是认为数据框会将变量复制到自己的数据结构中,从而消除了这种区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多