1

这是一些示例数据来说明我的问题

dput(example)
structure(list(ID1 = c("", "abj6498", "", "", "", "", "", "", 
"avl5803", "avl3030", "vz30775", "", "", "s883612", "avl7884", 
"", "", "avl7905", "", "", "", "", "ty68281", "", "", "z101246", 
"", "", "", "", "afh2697", "", "", "", "", "avl3037", "", "", 
"", "tw77193", "", "", "tw77053", "avl6702", "", "abj6256", "", 
"", "", ""), ID2 = c("", "and7457", "", "", "", "", "", "", "", 
"j215736", "vz33290", "", "", "afh4845", "", "", "", "j215809", 
"", "", "", "", "ty69088", "", "", "j215813", "", "", "avl6192", 
"", "j215807", "", "avl5585", "", "", "avl5441", "", "", "", 
"ty70093", "", "", "tr43355", "avl3013", "", "afh3143", "", "", 
"", "")), row.names = c(NA, -50L), class = "data.frame")

我有一个example有两个列的数据框,ID1ID2需要的只是一个新列,该列基于是否包含值中的present一个或两个ID1ID2

例如,如果ID1已满但未满,ID2则新列present应具有该值1,反之亦然,如果两者都包含一个值,present则将包含2

我尝试了各种使用tidyverse::mutateandif语句的方法,但不能完全正确地理解逻辑。

4

2 回答 2

3

我们可以用一个语句替换空NA并检查:case_when

library(dplyr)
df %>%
  mutate(across(everything(), ~ifelse(.=="", NA, as.character(.)))) %>% 
  mutate(present = case_when(!is.na(ID1) & !is.na(ID2) ~ 2,
                             !is.na(ID1) | !is.na(ID2) ~ 1)) 

输出:

   ID1     ID2     present
   <chr>   <chr>     <dbl>
 1 NA      NA           NA
 2 abj6498 and7457       2
 3 NA      NA           NA
 4 NA      NA           NA
 5 NA      NA           NA
 6 NA      NA           NA
 7 NA      NA           NA
 8 NA      NA           NA
 9 avl5803 NA            1
10 avl3030 j215736       2
# … with 40 more rows
于 2021-08-25T09:13:38.723 回答
2

我们可以rowSums用来计算连续不为空的值的数量。这将为那些都为空的值返回 0,NA如果需要,您可以将它们转换为。

example$present <- rowSums(example != '')
head(example, 10)

#       ID1     ID2 present
#1                        0
#2  abj6498 and7457       2
#3                        0
#4                        0
#5                        0
#6                        0
#7                        0
#8                        0
#9  avl5803               1
#10 avl3030 j215736       2
于 2021-08-25T10:19:14.503 回答