3

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

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 是我把整个事情完全复杂化了吗?

谢谢你的帮助。

4

1 回答 1

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 对应于 label "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
于 2012-11-01T12:05:28.063 回答