【问题标题】:Why data.frame doesn't parse the data frames arguments?为什么 data.frame 不解析数据帧参数?
【发布时间】:2013-04-23 19:15:19
【问题描述】:

这似乎与帮助文件中写的相反:

"如果将列表或数据框或矩阵传递给 data.frame,就好像 每个组件或列都作为单独的参数传递”

那我做错了什么?

示例代码:

d <- c("bla", "bla", "blou", "blou", "bli")
dtest <- data.frame(d, stringsAsFactors=FALSE)
dtest2 <- data.frame(dtest, stringsAsFactors=TRUE)
dtest3 <- data.frame(dtest[[1]], stringsAsFactors=TRUE)

str(c(dtest2, dtest3))

一个是字符向量,另一个已转换为因子(遵循 stringsAsFactor=TRUE 行为)。它们“应该”是两个因素。

我实际上想使用 data.frame(df) 将具有某些字符列的现有数据框转换为具有相应因子的数据框。

【问题讨论】:

  • 我知道我可以用类似的方式做后者:i &lt;- sapply(df,is.character) df[i] &lt;- lapply(df[i], as.factor) 但是仍然提出了解析数据帧的问题!

标签: r


【解决方案1】:

这样做:dtest &lt;- data.frame(d, stringsAsFactors=FALSE) 没有设置阻止对 data.frame 的后续调用应用默认 stringsAsFactors-behavior 的属性。你可以通过设置来达到这样的状态:

  options(stringsAsFactors=FALSE)

另一方面,如果您希望有类似的行为,您应该将整个列发送到 data.frame:

> dtest2 <- data.frame(dtest)
> dtest3 <- data.frame(dtest[1])
> 
> str(c(dtest2, dtest3))
List of 2
 $ d: chr [1:5] "bla" "bla" "blou" "blou" ...
 $ d: chr [1:5] "bla" "bla" "blou" "blou" ...

如果您想重新评估数据框的所有列,那么我想您可以这样做:

data.frame(lapply(dtest, as.vector) )

> str(data.frame(lapply(dtest, as.vector) ))
'data.frame':   5 obs. of  1 variable:
 $ d: Factor w/ 3 levels "bla","bli","blou": 1 1 3 3 2

【讨论】:

  • 我认为你没有理解我的问题(我的错)。我完全希望 data.frame 的后续调用以与将实际列向量作为单独元素提供给它的方式相同的方式重新格式化数据帧。换一种说法,我不明白为什么在您的示例中, dtest2 和 dtest3 不是因素。
  • Data.frames 是列表的列表。列表能够保存属性。将 data.frame 应用于现有数据框不应更改列表的属性(尽管您显然感觉不同)。您已经确定了如何获得一个因子(使用“[[”)所以有问题吗?
  • 是的。我希望函数 data.frame 能够正常运行,或者了解我不了解的情况。我稍微修改了这个例子,以更多地反映我看到的“问题”。
  • 我修改了我的答案以涵盖这种可能性,但添加 stringsAsFactors 参数并没有什么不同,因为这是默认设置。
  • 我知道它不会改变任何东西(假设默认选项是工厂选项),但我想强调 data.frame() 的两个实例之间行为的不对称性。您通过提供一种标准方法来回答我的问题,以执行 data.frame 应该对数据帧执行的操作。那么为什么帮助文件看起来有问题呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多