我有一个包含样本点组的数据框:
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是我完全过分复杂化了吗?
感谢您的帮助。
答案 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