从data.frame转置矢量列表

时间:2014-04-23 08:23:01

标签: r dataframe type-conversion

在我接手的现有项目中,我面临的问题是,在将变量保存到表或数据框时,它们会自动转换为数据类型字符,因为某些向量包含字符串& #34;错误",而其他人持有一个号码。不幸的是,当我创建一个表时,后者也被转换成字符。

我已经发现当我创建一个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()应用于多行向量,而是可以选择自动执行此操作。我现在所做的是编写一个函数,它将变量名列表作为输入,并单独转换每个变量名。由于我的向量列表很长,而且我必须在整个代码中多次执行此操作,我不禁觉得必须有更优雅的方法来执行此操作 - 是吗?

2 个答案:

答案 0 :(得分:3)

问题与data.frame没有关联,只是说你不能拥有类numeric的同一个vector对象和class character的对象。这是不可能的。

在您之前启动项目的人不应该使用字符串“Error”来表示缺少数据。相反,你应该使用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)

答案 1 :(得分:0)

你可以这样做:

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"

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