R case_在报告所选变量的名称及其值时是否可以?

R case_在报告所选变量的名称及其值时是否可以?,r,dataframe,dplyr,case-when,R,Dataframe,Dplyr,Case When,我有一个数据集,其中对于每个唯一的DOI,特定变量的值分散在三个变量(列)的任意组合中。这是因为我在三个不同的在线搜索引擎中搜索DOI信息,并将结果合并到一个文件中。示例数据集如下所示: df1 <- data.frame( 'DOI' = c("A","B","C","D","E", "G", "H", "I") , 'V

我有一个数据集,其中对于每个唯一的DOI,特定变量的值分散在三个变量(列)的任意组合中。这是因为我在三个不同的在线搜索引擎中搜索DOI信息,并将结果合并到一个文件中。示例数据集如下所示:

df1 <- data.frame(
  'DOI' = c("A","B","C","D","E", "G", "H", "I")
  , 'V2' = c(1,NA,NA,4,5,NA,7, NA)
  , 'V3' = c(NA,2,NA,4,5,6,NA, NA)
  , 'V4' = c(NA,NA,3,4,NA,6,7, NA)
)

df1

  DOI V2 V3 V4
1   A  1 NA NA
2   B NA  2 NA
3   C NA NA  3
4   D  4  4  4
5   E  5  5 NA
6   G NA  6  6
7   H  7 NA  7
8   I NA NA NA

df1这里有一个基本R选项,使用
max.col
选择每行中的第一个非NA值和相应的列名

inds <- max.col(!is.na(df1[-1]), 'first')
df1$V5 <- df1[-1][cbind(1:nrow(df1), inds)]
df1$V6 <- names(df1[-1])[inds]
#To replace column name with all NA value to NA
df1$V6[rowSums(!is.na(df1[-1])) == 0] <- NA
我们使用
-1
,因为我们希望忽略计算中的第一列
DOI

使用基数R:

> df1
  DOI V2 V3 V4
1   A  1 NA NA
2   B NA  2 NA
3   C NA NA  3
4   D  4  4  4
5   E  5  5 NA
6   G NA  6  6
7   H  7 NA  7
8   I NA NA NA
> df1$V5 <- apply(df1[2:4], 1, max, na.rm = T)
> df1$V5[is.infinite(df1$V5)] <- NA
> df1$V6 <- apply(df1[2:4],1,which.max)
> df1$V6 <- as.integer(df1$V6)
> df1$V6 <- names(df1)[2:4][df1$V6]
> df1
  DOI V2 V3 V4 V5   V6
1   A  1 NA NA  1   V2
2   B NA  2 NA  2   V3
3   C NA NA  3  3   V4
4   D  4  4  4  4   V2
5   E  5  5 NA  5   V2
6   G NA  6  6  6   V3
7   H  7 NA  7  7   V2
8   I NA NA NA NA <NA>
> 
>df1
DOI V2 V3 V4
1a 1na
2b-NA-2na
3c-na3
4d4
5 E 5 NA
6g钠6
7H7Na7
8我拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿拿
>df1$V5 df1$V5[is.infinite(df1$V5)]df1$V6 df1$V6 df1$V6 df1$V6 df1
DOI V2 V3 V5 V6
1 A 1 NA 1 V2
2b NA 2na 2v3
3 C NA 3 3 V4
4d4v2
5 E 5 NA 5 V2
6g钠6 V3
7 H 7 NA 7 V2
8我不知道不知道
> 
inds <- max.col(!is.na(df1[-1]), 'first')
df1$V5 <- df1[-1][cbind(1:nrow(df1), inds)]
df1$V6 <- names(df1[-1])[inds]
#To replace column name with all NA value to NA
df1$V6[rowSums(!is.na(df1[-1])) == 0] <- NA
library(dplyr)

df1 %>%
  rowwise() %>%
  mutate(V5 = na.omit(c_across(V2:V4))[1], 
         V6 = names(.)[-1][which(!is.na(c_across(V2:V4)))[1]])

#   DOI      V2    V3    V4    V5 V6   
#  <chr> <dbl> <dbl> <dbl> <dbl> <chr>
#1 A         1    NA    NA     1 V2   
#2 B        NA     2    NA     2 V3   
#3 C        NA    NA     3     3 V4   
#4 D         4     4     4     4 V2   
#5 E         5     5    NA     5 V2   
#6 G        NA     6     6     6 V3   
#7 H         7    NA     7     7 V2   
#8 I        NA    NA    NA    NA NA   
> df1
  DOI V2 V3 V4
1   A  1 NA NA
2   B NA  2 NA
3   C NA NA  3
4   D  4  4  4
5   E  5  5 NA
6   G NA  6  6
7   H  7 NA  7
8   I NA NA NA
> df1$V5 <- apply(df1[2:4], 1, max, na.rm = T)
> df1$V5[is.infinite(df1$V5)] <- NA
> df1$V6 <- apply(df1[2:4],1,which.max)
> df1$V6 <- as.integer(df1$V6)
> df1$V6 <- names(df1)[2:4][df1$V6]
> df1
  DOI V2 V3 V4 V5   V6
1   A  1 NA NA  1   V2
2   B NA  2 NA  2   V3
3   C NA NA  3  3   V4
4   D  4  4  4  4   V2
5   E  5  5 NA  5   V2
6   G NA  6  6  6   V3
7   H  7 NA  7  7   V2
8   I NA NA NA NA <NA>
>