我正在创建一个新变量" 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.的新手 谢谢, 奇
答案 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是访问列的一种不好的方法。使用with
或transform
更安全。另一种可能性是你不明白“&amp;”处理NA值。
答案 2 :(得分:0)
HS <- rep(5,length(data1))
不正确。它应该是HS <- rep(5,nrow(data1))
coz length
是变量的数量。
谢谢你们