基于查找向量的条件重编码

时间:2017-11-09 02:02:53

标签: r dplyr lookup recode

我需要根据查找向量有条件地重新编码我的数据帧for (int i = 0; i < web.size(); i++) { switch (i) { case 0: if (blablabla== true) { imageId.add(R.drawable.ic_luncher); } else { imageId.add(R.drawable.ic_luncher); } break; case 1: if (lvl1 == true) { //set image 1 imageId.add(R.drawable.ic_luncher); } else { //set image 2 imageId.add(R.drawable.ic_luncher); } break; case 2: if (lvl2 == true) { //set image 1 imageId.add(R.drawable.ic_luncher); } else { //set image 2 imageId.add(R.drawable.ic_luncher); } break; default: } }

d

dput(lookup) structure(c("Apple", "Apple", "Banana", "Carrot"), .Names = c("101", "102", "102", "103")) dput(d) structure(list(pat = c(101, 101, 101, 102, 102, 103), gene = structure(1:6, .Label = c("a", "b", "c", "d", "e", "f"), class = "factor"), Apple = c(0.1, 0.2, 0.3, 0.4, NA, NA), Banana = c(NA, NA, NA, NA, 0.55, NA), Carrot = c(NA, NA, NA, NA, NA, 0.6)), .Names = c("pat", "gene", "Apple", "Banana", "Carrot"), row.names = c(NA, -6L), class = "data.frame") 是我通过d获得的广泛数据框。如果reshape与该列匹配,我需要在每个列NAsAppleBanana内重新编码Carrot 0 pat查找表。在这种情况下,d$Apple[5]d$Banana[4]会被重新编码为0

我一直在玩recode来自dplyr,但我不知道如何让它进行查找和重新编码,更不用说它必须在多个列上完成了。 。recoding variables in R with a lookup table上还有另一篇相关帖子,但它似乎无法应用于我的问题。任何人都可以帮我吗?谢谢!

修改

我尝试了以下内容:

e <- melt(d, id.vars=c("pat", "gene"))
e %>% mutate(test=ifelse(lookup[as.character(pat)] == variable, replace(value, is.na(value), 0), value))

我的代码部分有效。它成功地重新编码了NA中的d$Apple[5],但没有记录d$Banana[4],因为查找只能给出第一个值:

lookup["102"]
    102 
"Apple" 

而我需要我的查找才能输出&#34; Apple&#34;和#34;香蕉&#34;并能够相应地转换满足每个条件的NAs。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

抱歉,此处没有form_valid,但代码非常简单。

dplyr

答案 1 :(得分:0)

可能有点不完整,但我已设法通过循环创建一个可能的解决方案

for(i in 1:nrow(d)){
  mtch <- lookup[which(d$pat[i] == names(lookup))] # Get lookup matches for row i
  colnum <- which(colnames(d) %in% mtch) # Get column nr that matches lookup value
  newval<-ifelse(is.na(d[i,colnum]),0,d[i,colnum]) # if it contains NA replace with 0
  d[i,colnum]<-unlist(newval) # replace the values

}

输出

  pat gene Apple Banana Carrot
1 101    a   0.1     NA     NA
2 101    b   0.2     NA     NA
3 101    c   0.3     NA     NA
4 102    d   0.4   0.00     NA
5 102    e   0.0   0.55     NA
6 103    f    NA     NA    0.6

希望有所帮助

答案 2 :(得分:0)

我会使用长格式并使用dplyr中的连接。

我首先回到如下所示的长格式:

library(tidyverse)
long_format <- d %>% 
  gather(fruit, value, -pat, -gene) 

然后我将查找创建为data_frame,因此我们可以使用连接。

lookup <- tribble(~pat, ~fruit,
                  101, "Apple",
                  102, "Apple",
                  102, "Banana",
                  103, "Carrot")

使用right_join表示我们保留查找中的所有组合。然后,我们用0替换缺失的值,并在需要时将其扩展回宽格式。

long_format %>% 
  right_join(lookup) %>% 
  replace_na(replace = list(value = 0)) %>%
  spread(fruit, value)
#> Joining, by = c("pat", "fruit")
#> pat gene Apple Banana Carrot
#> 1 101    a   0.1     NA     NA
#> 2 101    b   0.2     NA     NA
#> 3 101    c   0.3     NA     NA
#> 4 102    d   0.4   0.00     NA
#> 5 102    e   0.0   0.55     NA
#> 6 103    f    NA     NA    0.6