在我接手的现有项目中,我面临的问题是,在将变量保存到表或数据框时,它们会自动转换为数据类型字符,因为某些向量包含字符串& #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()应用于多行向量,而是可以选择自动执行此操作。我现在所做的是编写一个函数,它将变量名列表作为输入,并单独转换每个变量名。由于我的向量列表很长,而且我必须在整个代码中多次执行此操作,我不禁觉得必须有更优雅的方法来执行此操作 - 是吗?
答案 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"
您只需设置正确的列名称。