我正在创建一个新变量"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的新手。谢谢琪琪
在这里,我假设原始数据集中有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="_"))) )
当你说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 的值。使用附加是访问列的不良方法。使用with
或transform
更安全。另一种可能性是你不明白"&"如何处理 NA 值。
我发现了问题。 太笨了。 HS <- rep(5,length(data1))
不正确。它应该是HS <- rep(5,nrow(data1))
coz length
是变量的数量。
谢谢大家