在因子中重新编码NA

时间:2012-11-01 11:53:21

标签: r

我有一个包含样本点组的数据框:

samplePoint<-c("1","1","1","1","2","2","2","2","3","3","3","3")
category<-c("a", "a", "a", NA, "b", "b", NA, "b", NA, "a", "a", "a")
values<-c(0.51, 0.21, 0.31, 0.22, 0.61, 0.71, 0.52, 0.32, 0.23, 0.1, 0.24, 0.33)
dat<-data.frame(samplePoint, category, values)

我需要在dat $ category中重新编写NA,以便稍后在此过程中使用。每个样本点只有一个类别:1应该都是“a”,2 =“b”,3 =“a”。

我尝试使用ifelse函数进行聚合,打算使用匹配或查找类型函数进行重新编码:

codeList<-aggregate(
dat$category, by=list(dat$samplePoint),
FUN=function(x){ifelse(length(which(x=="a")) > length(which(x=="b")), "a", "b")}
)
问题1是,如何解决匹配问题? 问题2是我完全过分复杂化了吗?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

Q1:你没有,因为, Q2:是的,大规模。

您可以做的是在适当转换的样本点上使用factor,并使用所需的标签。

category <- factor((as.numeric(samplePoint)+1)%%2,labels=letters[1:2])
category
 [1] a a a a b b b b a a a a
Levels: a b

转换使用模数运算符(%%)将采样点转换为二进制输出,但点被移动以使点1和3对应于标签"a"。任何其他点将以相同的方式编码,即4:“b”,5:“a”。

<强>更新

在评论中得到澄清后,我认为这可能会有所帮助:

(catTable <- aggregate(category,list(samplePoint=samplePoint),function(x) unique(x[!is.na(x)])))
  samplePoint x
1           1 a
2           2 b
3           3 a

这为您提供了一个data.frame,您可以merge使用原始数据来获得所需内容。

merge(dat,catTable,all.x=T)
   samplePoint category values x
1            1        a   0.51 a
2            1        a   0.21 a
3            1        a   0.31 a
4            1     <NA>   0.22 a
5            2        b   0.61 b
6            2        b   0.71 b
7            2     <NA>   0.52 b
8            2        b   0.32 b
9            3     <NA>   0.23 a
10           3        a   0.10 a
11           3        a   0.24 a
12           3        a   0.33 a