在下达的分配中不允许在一个lapply" NAs中分配"

时间:2013-08-20 15:36:35

标签: r

我正在尝试重新编码,并且遇到了一个看起来很简单的障碍,但是在相当一段时间问互联网之后我还没弄清楚,所以我感谢你能给予的任何帮助。

我有一些包含NA的数据。我想重新编码,使用这些数据,但继续遇到错误“订阅的作业中不允许使用NA”。当我试图创建一个示例数据集时,我还发出一个警告,我没有“有意义的因素”。任何帮助将不胜感激。

我的虚假数据有三个变量:“var1”和“var2”(字符,有时缺失)和“var3”(数字)。我想创建第四个变量,如果beta大于零,则包含“var1”的值,如果beta小于零,则包含值“var2”。如果缺少var1或var2,我希望新变量也丢失:

var1<-c("A","T",NA,"G","C")
var2<-c("G","A",NA,"A","G")
var3 <-c(-.1,3,-4,5,-3)
df=as.data.frame(cbind(var1,var2,var3))

df$newVar[df$var3>0]=df$var1[df$var3>0]
df$newVar[df$var3<0]=df$var2[df$var3<0]

我得到的是一堆红色:

df$newVar[df$var3>0]=df$var1[df$var3>0]
Error in df$newVar[df$var3 > 0] = df$var1[df$var3 > 0] : 
NAs are not allowed in subscripted assignments
In addition: Warning messages:
1: In Ops.factor(df$var3, 0) : > not meaningful for factors
2: In Ops.factor(df$var3, 0) : > not meaningful for factors
df$newVar[df$var3<0]=df$var2[df$var3<0]
Error in df$newVar[df$var3 < 0] = df$var2[df$var3 < 0] : 
NAs are not allowed in subscripted assignments
In addition: Warning messages:
1: In Ops.factor(df$var3, 0) : < not meaningful for factors
2: In Ops.factor(df$var3, 0) : < not meaningful for factors

任何建议都将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:4)

您的问题是您在cbind之前使用data.frame,这会将您的三个变量强制转换为同一个类(必须是字符),导致它们在您制作时会被强制要求data.frame。

相反,只需做

df <- data.frame(var1, var2, var3)

newVar运行相同的代码,你应该得到:

  var1 var2 var3 newVar
1    A    G -0.1      2
2    T    A  3.0      4
3 <NA> <NA> -4.0     NA
4    G    A  5.0      3
5    C    G -3.0      2

答案 1 :(得分:1)

您可以大大简化重新编码变量的方式。不要像其他地方已经指出的那样使用cbind,但是......你可以提供一个2列的下标变量矩阵来对你的数据帧进行子集化。所以我们可以这样做:

df <- data.frame( var1 , var2 , var3 )

#  Gives 1 if 'var3' is greater than 0 and 2 otherwise (the numbers of the columns you want!)
ind <- (! df$var3 > 0) + 1
#[1] 2 1 2 1 2

#  Get each row selecting either column 1 or two
df$newVar <- df[ cbind( 1:nrow(df) , ind ) ]
# var1 var2 var3 newVar
#1    A    G -0.1      G
#2    T    A  3.0      T
#3 <NA> <NA> -4.0   <NA>
#4    G    A  5.0      G
#5    C    G -3.0      G