【问题标题】:R First Row Value Meets CriteriaR 第一行值符合标准
【发布时间】:2020-07-15 22:11:33
【问题描述】:
data = data.frame(STUDENT=c(1,2,3,4,5,6,7,8),
CAT=c(NA,NA,1,2,3,NA,NA,0),
DOG=c(NA,NA,2,3,2,NA,1,NA),
MOUSE=c(2,3,NA,NA,NA,NA,NA,NA),
WANT=c(2,3,2,2,3,NA,NA,NA))

我有“数据”并希望创建“WANT”变量,它的作用是取第一个不等于“1”或“0”的非 NA 值并将其存储在“WANT”中.上面的代码示例显示了我希望得到的示例。

【问题讨论】:

  • @akrun 谢谢你的好消息,我现在修好了!

标签: r dplyr data.table


【解决方案1】:

我们可以将选中列中的值0、1更改为NA后使用coalesce,然后将该列与原始数据集绑定

library(dplyr)
data %>%
    transmute(across(CAT:MOUSE, ~ replace(., . %in% 0:1, NA))) %>% 
    transmute(WANT2 = coalesce(!!! .)) %>%
    bind_cols(data, .)
#  STUDENT CAT DOG MOUSE WANT WANT2
#1       1  NA  NA     2    2     2
#2       2  NA  NA     3    3     3
#3       3   1   2    NA    2     2
#4       4   2   3    NA    2     2
#5       5   3   2    NA    3     3
#6       6  NA  NA    NA   NA    NA
#7       7  NA   1    NA   NA    NA
#8       8   0  NA    NA   NA    NA

或者使用data.tablefcoalesce。将'data.frame'转换为'data.table'(setDT(data)),在.SDcols中指定感兴趣的列,循环.SDreplace的值是0、1到NA,使用fcoalesce 并分配(:=)它来创建新列'WANT2'

library(data.table)
setDT(data)[, WANT2 := do.call(fcoalesce, lapply(.SD, function(x) 
         replace(x, x %in% 0:1, NA))), .SDcols = CAT:MOUSE]

或者使用base R,我们可以使用带有行/列索引的矢量化选项在replace将值0、1到NA之后提取first非NA元素

m1 <- !is.na(replace(data[2:4], data[2:4] == 1|data[2:4] == 0, NA))
data$WAN2 <- data[2:4][cbind(seq_len(nrow(m1)), max.col(m1, "first"))]
data$WANT2[data$WANT2 == 0] <- NA

【讨论】:

  • 完美我会在允许的时候接受答案
  • 我的最后一个问题是,如果我想明确地使用名称而不是 CAT:MOUSE 如果我只希望使用 CAT 和 MOUSE 怎么办?
  • @bvowe 在第一个解决方案across(c(CAT, MOUSE), ~ 和第二个解决方案.SDcols = c("CAT", "MOUSE")
【解决方案2】:

试试这个:

data$Want2 <- apply(data[,-c(1,5)],1,function(x) x[min(which(!is.na(x) & x!=0 & x!=1))])

  STUDENT CAT DOG MOUSE WANT Want2
1       1  NA  NA     2    2     2
2       2  NA  NA     3    3     3
3       3   1   2    NA    2     2
4       4   2   3    NA    2     2
5       5   3   2    NA    3     3
6       6  NA  NA    NA   NA    NA
7       7  NA   1    NA   NA    NA
8       8   0  NA    NA    0    NA

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2021-11-10
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    相关资源
    最近更新 更多