首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多变量的存在/缺席

多变量的存在/缺席
EN

Stack Overflow用户
提问于 2020-10-14 10:28:15
回答 2查看 134关注 0票数 1

我有一个数据集,其中相同的观察(一个对象)有多个变量,可以具有相同的值(装饰主题)。

代码语言:javascript
复制
decor_data <- data.frame(Site= "XYZ", 
                   Motif1 = c("A", "B", "B", "B", "A", "C"), 
                   Motif2 = c("C", "D", "D", "A", NA, "B"), 
                   Motif3 = c("B", "A", NA, NA, NA, NA), 
                   Motif4 = c("D", NA, NA, NA, NA, NA))

现在,我想为每个motif值创建一个列,该列记录它们的存在或缺位。

我可以通过这样的函数来做到这一点:

代码语言:javascript
复制
 presabs.decor <- function(data, motif){
  data <- data %>% dplyr::mutate((!!quo_name (motif)) := case_when((Motif1 == motif | Motif2 == motif | Motif3 == motif | Motif4 == motif) ~ 1, TRUE~0))
}

但是,每次我都要给出变量的名称,这显然是浪费时间。

代码语言:javascript
复制
    decors <- decor_data %>% presabs.decor("A") %>% 
                             presabs.decor("B") %>% 
                             presabs.decor("C") %>% 
                             presabs.decor("D")

有很多方法可以通过一个列(例如使用dcast )来实现这一点,但是我还没有找到任何可以跨多个列工作的方法,就像我需要的那样。

我觉得我漏掉了一些很明显的东西。

任何帮助都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-14 10:38:45

使用底座

代码语言:javascript
复制
#get unique motif names
m <- na.omit(unique(unlist(decor_data[, -1])))

cbind(decor_data, 
      sapply(m, function(i) rowSums(decor_data[, -1] == i, na.rm = TRUE)))
#   Site Motif1 Motif2 Motif3 Motif4 A B C D
# 1  XYZ      A      C      B      D 1 1 1 1
# 2  XYZ      B      D      A   <NA> 1 1 0 1
# 3  XYZ      B      D   <NA>   <NA> 0 1 0 1
# 4  XYZ      B      A   <NA>   <NA> 1 1 0 0
# 5  XYZ      A   <NA>   <NA>   <NA> 1 0 0 0
# 6  XYZ      C      B   <NA>   <NA> 0 1 1 0
票数 4
EN

Stack Overflow用户

发布于 2020-10-14 11:10:04

使用data.tabletidyverse

代码语言:javascript
复制
setDT(decor_data)

motif_vars <- str_subset(names(decor_data), "Motif")

decor_data[, (motif_vars) := map(.SD, as.character), .SD = motif_vars]

motif_values <- decor_data[, motif_vars, with = FALSE] %>% 
  unlist() %>% 
  unique() %>% 
  .[!is.na(.)] 

decor_data[, motif := pmap_chr(.SD, ~c(...) %>% .[!is.na(.)] %>% str_c(collapse = "")), .SD = motif_vars]
decor_data[, (motif_values) := map(motif_values, ~str_detect(motif, .x) * 1L)]

decor_data %>% select(-motif)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64351379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档