我有大数据,迷你版如下:
Pr1 <- c("AA", "BB", "BB", "BB", "BB", "--", "AA", "--")
Pr2 <- c("BB", "AA", "AA", "AA", "AA", "--", "--", "BB")
varA <- c("BB", "AA", "AA", "BB", "BB", "AA", "--", "BB")
varB <- c("AA", "BB", "AA", "BB", "BB", "AA", "--", "BB")
varC <- c("AB", "--", "AB", "BB", "AB", "AA", "--", "AB")
varD <- c("BB", "AA", "AB", "BB", "BB", "AB", "AB", "BB")
mydf <- data.frame (Pr1, Pr2, varA, varB, varC, varD)
数据如下所示:
mydf
Pr1 Pr2 varA varB varC varD
1 AA BB BB AA AB BB
2 BB AA AA BB -- AA
3 BB AA AA AA AB AB
4 BB AA BB BB BB BB
5 BB AA BB BB AB BB
6 -- -- AA AA AA AB
7 AA -- -- -- -- AB
8 -- BB BB BB AB BB
我需要根据前两个来重新编码数据帧中的其余变量:
如果varA到varD的元素(数据集的结尾) -
等于Pr2值,varA到varD的元素将是“B”
既不等于Pr1和Pr2也不等于varA到varD将是“H”
但是 - 缺少值,上述规则不适用于该情况。
如果Pr1和Pr2缺失( - ),那么对于所有值,比较结果为“NA”。
如此预期的结果:
Pr1 Pr2 varA varB varC varD
1 AA BB B A H B
2 BB AA B A -- B
3 BB AA B B H H
4 BB AA A A A A
5 BB AA A A H A
6 -- -- NA NA NA NA
7 AA -- NA NA NA NA
8 -- BB NA NA NA NA
我可以找到一种方法来执行它。
答案 0 :(得分:2)
写一个小功能,只做1行,然后应用它。我发现首先转换为矩阵很方便
mymat <- as.matrix(mydf)
recodeRows <- function(x){
if (any(x[1:2]=="--")){
x[3:ncol(mymat)] <- NA
} else {
x[3:ncol(mymat)][x[3:ncol(mymat)]==x[1]] <- "A"
x[3:ncol(mymat)][x[3:ncol(mymat)]==x[2]] <- "B"
x[3:ncol(mymat)][!x[3:ncol(mymat)] %in% c("A","B","--")] <- "H"
}
x
}
t(apply(mymat,1,recodeRows))
[编辑包括约翰的ncol(mymat)评论]
答案 1 :(得分:1)
通过设置:
来提取数据时,您可以节省一些工作 na.strings="--"
自动将“ - ”元素设置为NA
,您也可以将其设置为不将字符串转换为因子。 as.is=TRUE
请参阅?read.table
这两个设置意味着你现在正在处理那些不是自动因素并且NA应该在哪里的东西。
而且......当我写这篇文章时,有人已经提出了一个函数,所以我会停在那里,你可以把它视为一个扩展的评论。