【问题标题】:Transpose list of vectors to from data.frame将向量列表转置为来自 data.frame
【发布时间】:2014-06-07 22:57:29
【问题描述】:

在我接手的一个现有项目中,我面临一个问题,即当我将变量保存到表或数据框时,它们会自动转换为数据类型字符,因为一些向量由字符串 "错误”,而其他人则持有一个数字。不幸的是,后者在我创建表格时也会转换为字符。

我发现当我创建一个 data.frame 而不是一个表时,只有包含文本的列是字符,其余的保持数字。但是,我面临的问题是某些向量包含的行比其他向量多(少数只包含一个参数,其他两个或三个)。

我想要做的是从所有这些向量中创建一个 data.frame,并将向量的值放在一行中。例如,发生这种情况:

x <- 1
y <- c("Error","Error")
data.frame(x,y)

  x y
1 1 Error
2 1 Error

我不想要两行,但我正在寻找的结果是:

x <- 1
y <- t(c("Error","Error"))
data.frame(x,y)

  x    X1    X2
1 1 Error Error

我想到的第一件事就是:

> x <- 1
> y <- c("Error", "Error")
> newframe <- data.frame(t(c(x,y)))
> class(newframe$X1)
[1] "factor"

但不幸的是,转置包含向量值的标量的行为,如 attributes() 所示,会导致 x 的元素在创建 data.frame 时转换为字符,然后转换为因子。

问题是,我不想手动将 t() 应用于多行向量,而是可以选择自动执行此操作。我现在所做的是编写一个函数,该函数将变量名称列表作为输入并单独转置每个变量。由于我的向量列表很长,而且我必须在整个代码中多次执行此操作,我不禁觉得必须有一种更优雅的方式来执行此操作 - 有吗?

【问题讨论】:

  • 在你的最后一个例子中:newframe &lt;- data.frame(t(c(x,y)),stringsAsFactors=FALSE) 会给你class(newframe$X1) = character
  • 使用NA,就像@RockScience 说的那样。

标签: r dataframe type-conversion


【解决方案1】:

问题与 data.frame 无关,而只是您不能在同一矢量对象中拥有数字类和字符类对象。这是不可能的。

在您之前开始该项目的人不应该使用字符串“错误”来指示缺少数据。相反,您应该使用 NA :

x=c(1,2)
y=c("Error","Error")
c(x,y) # Here the result is coerced as character automatically by R. There is no way to avoid that.

你应该使用

c(x,NA) # NA is accepted in a vector of numeric

注意:您应该将 data.frame 视为一个向量列表,这些向量是 data.frame 的列。因此,如果您有 2 列,每一列都是一个独立的向量,因此每列可能有不同的类:

x <- c(1,2)
y <- c("Error","Error")
df=data.frame(x=x,y=y,stringsAsFactors=FALSE)
class(df$x)
class(df$y)

现在,如果您尝试转置 data.frame,当然新的列向量将变为 c(1,"Error") 和 c(2,"Error"),它们将被强制转换为我们之前看到的字符.

t(df)

【讨论】:

    【解决方案2】:

    你可以这样做:

    x <- 1
    y <- c("Error","Error")
    df <- data.frame(c(list(), x, y), stringsAsFactors = FALSE)
    > str(df)
    'data.frame':   1 obs. of  3 variables:
     $ X1        : num 1
     $ X.Error.  : chr "Error"
     $ X.Error..1: chr "Error"
    

    您只需要设置正确的列名。

    【讨论】:

    • 这是错误的方法。使用NA。这正是创建 NA 的目的。它是数字类型。因此也应该跑得更快。
    猜你喜欢
    • 2011-10-27
    • 2020-06-21
    • 1970-01-01
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多