R:创建新变量,新值不正确



我正在创建一个新变量"HS"来总结"data1"中的4个变量"HS_A/B/C/D",使用:

HS <- rep(5,length(data1))
attach(data1)
HS[ HS_A == 2 & HS_B == 2 & HS_C==2 & HS_D==2 ] <- 0
HS[ HS_A == 1 & HS_B == 2 & HS_C==2 & HS_D==2 ] <- 1
HS[ HS_B == 1 & HS_A == 2 & HS_C==2 & HS_D==2 ] <- 2
HS[ HS_C == 1 & HS_A == 2 & HS_B==2 & HS_D==2 ] <- 3
HS[ HS_D == 1 & HS_A == 2 & HS_B==2 & HS_C==2 ] <- 4
hs1<-data.frame(HS_A,HS_B,HS_C,HS_D,HS)

我希望HS中的所有其他值都5,如果它们不是 0/1/2/3/4,所以我只使用 5 rep。问题是,HS中的某些值是NA的,而我认为它们应该是5的。

data1中没有NA,我已经使用 (which(!!rowSums(is.na(hs))) 检查了具有HS NA的行。 #[1] 1545 1646 1687 1744 1784 1817,它们是"1212NA"1112NA"1112NA"1112NA"1112NA"1112NA"。

谁能帮忙解释为什么? 有没有办法解决或更简单的方法来创建变量?

还有如何在for循环中执行新变量?

我是R的新手。谢谢琪琪

在这里,我假设原始数据集中有NAdata1。 因此,如果一行包含NA值,则指定的任何条件都将变得FALSE,并将获得 5 的值。 在某些情况下,列之间的组合可能为条件返回 FALSE,这些条件也5给出。

  indx <- as.character(interaction(data1, sep=''))
  lvls <- c('2222', '1222', '2122', '2212', '2221')
  indx[!indx %in% lvls] <- 6
  data1$HS <- as.numeric(factor(indx, levels=c(lvls,6)))-1

以下是data1的一瞥

  lapply(split(data1, data1$HS), head,2)
  #$`0`
  #      HS_A HS_B HS_C HS_D HS
  #1029    2    2    2    2  0
  #1064    2    2    2    2  0
  #$`1`
  #    HS_A HS_B HS_C HS_D HS
  #164    1    2    2    2  1
  #661    1    2    2    2  1
  #$`2`
  #    HS_A HS_B HS_C HS_D HS
  #46     2    1    2    2  2
  #211    2    1    2    2  2
  #$`3`
  #    HS_A HS_B HS_C HS_D HS
  #349    2    2    1    2  3
  #429    2    2    1    2  3
  #$`4`
  #    HS_A HS_B HS_C HS_D HS
  #152    2    2    2    1  4
  #307    2    2    2    1  4
  #$`5`
  #   HS_A HS_B HS_C HS_D HS
  #1   NA    2    3    1  5
  #2    1    3   NA    2  5

数据

  set.seed(345)
  data1 <- as.data.frame(matrix(sample(c(NA, 1:3), 4*1500, replace=TRUE), 
                 ncol=4, dimnames=list(NULL, paste("HS", LETTERS[1:4], sep="_"))) )

当你说which(HS==NA)时,你对"=="函数如何处理NA感到困惑。is.na存在的原因是没有什么等于NA。使用有点臃肿的akrun示例,您可以看到带有arr.in=TRUE的which((是如何工作的:

 str( which(is.na(data1), arr.ind=TRUE))
#--------------------------
 int [1:1446, 1:2] 1 10 13 16 18 23 24 25 28 31 ...
 - attr(*, "dimnames")=List of 2
  ..$ : NULL
  ..$ : chr [1:2] "row" "col"
> head( which(is.na(data1), arr.ind=TRUE))
     row col
[1,]   1   1
[2,]  10   1
[3,]  13   1
[4,]  16   1
[5,]  18   1
[6,]  23   1

我怀疑其余的问题在于您如何命名 data1 的值。使用附加是访问列的不良方法。使用withtransform更安全。另一种可能性是你不明白"&"如何处理 NA 值。

抱歉,

我发现了问题。 太笨了。 HS <- rep(5,length(data1))不正确。它应该是HS <- rep(5,nrow(data1)) coz length 是变量的数量。

谢谢大家

最新更新