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

时间:2014-10-28 04:18:39

标签: r variables

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

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,那么我只使用rep 5。 问题是,HS中的某些值为NA,而我认为它们应为5

NA中没有data1,我使用HS NA检查which(!!rowSums(is.na(hs))) #[1] 1545 1646 1687 1744 1784 1817行。 1212NA他们是&#34; 1112NA&#34; &#34; 1112NA&#34; &#34; 1112NA&#34; &#34; 1112NA&#34;&#34; 1112NA&#34;&#34; for&#34;

任何人都可以帮忙解释原因吗?有没有办法解决或更简单的方法来创建变量?

如何在{{1}}循环中执行新变量?

我是R.的新手 谢谢, 奇

3 个答案:

答案 0 :(得分:0)

我假设原始数据集NA中有data1个值。因此,如果某行包含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="_"))) )

答案 1 :(得分:0)

当你说which(HS==NA)时,你会被告知“==”函数如何处理NA。 is.na存在的原因是没有任何东西等于NA。使用akrun的一些臃肿的例子,你可以看到arr.in = TRUE的哪个()工作原理:

 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的值。使用attach是访问列的一种不好的方法。使用withtransform更安全。另一种可能性是你不明白“&amp;”处理NA值。

答案 2 :(得分:0)

抱歉,我发现了这个问题。这是愚蠢的。 HS <- rep(5,length(data1))不正确。它应该是HS <- rep(5,nrow(data1)) coz length是变量的数量。

谢谢你们