将向量列表转换为数据框的形式

4
在我接手的现有项目中,我遇到了一个问题,当我将变量保存到表格或数据框中时,它们会自动转换为字符型数据类型,因为一些向量包含字符串"error",而其他向量则包含数字。不幸的是,当我创建一个表格时,后者也被转换为字符型数据。
我已经发现,当我创建一个数据框而不是一个表格时,只有包含文本的列才是字符型数据,其余的都是数值型数据。然而,我面临的问题是,有些向量包含的行数比其他向量多(有些只包含一个参数,而其他向量包含两个或三个)。
我的目标是,创建一个数据框,其中所有这些向量的值在同一行中。例如,出现了这种情况:
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()所示的转置标量包含向量的值的行为会在创建data.frame时将x的元素转换为字符,然后转换为因子。

问题在于,我不想手动将多行向量应用于t(),而是更希望有一个选项可以自动执行此操作。目前我所做的是编写一个函数,该函数将变量名称列表作为输入,并单独对每个变量进行转置。由于我的向量列表相当长,并且我必须在代码中多次执行此操作,因此我不禁感到一定有更优雅的方法来完成这个任务 - 是否有?


在你的最后一个例子中:newframe <- data.frame(t(c(x,y)),stringsAsFactors=FALSE) 将会得到 class(newframe$X1) = character - RockScience
使用 NA,就像 @RockScience 所说的那样。 - smci
2个回答

3
问题并不与data.frame有关,而是您不能在同一个向量中同时使用数字类对象和字符类对象。这是不可能的。
在您之前开始项目的人不应该使用字符串“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

注意:你应该将数据框视为向量列表,这些向量是数据框的列。因此,如果你有两列,每一列都是独立的向量,因此每一列可能具有不同的类:

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

现在,如果您尝试转置该数据框,则新的列向量自然会变为c(1,“Error”)和c(2,“Error”),将像我们之前看到的那样被强制转换为字符。
t(df)

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"

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


这是错误的方法。请使用“NA”。这正是“NA”创建的原因,它是数字类型,因此也应该运行更快。 - smci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接