Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每行最后一个非NA行的列名;使用tidyverse解决方案?_R_Dplyr_Na_Tidyverse_Tibble - Fatal编程技术网

每行最后一个非NA行的列名;使用tidyverse解决方案?

每行最后一个非NA行的列名;使用tidyverse解决方案?,r,dplyr,na,tidyverse,tibble,R,Dplyr,Na,Tidyverse,Tibble,简要数据集描述:我有从Qualtrics生成的调查数据,我已将其作为TIBLE导入R。每列对应一个调查问题,我保留了原始的列顺序(与调查中问题的顺序相对应) 简单语言问题:由于正常的参与者流失,并非所有参与者都完成了调查中的所有问题。我想知道每个参与者在调查中走了多远,以及他们在停下来之前回答的最后一个问题 R:中的问题陈述我要生成(使用tidyverse): 1) 一个新列(lastq),列出每行(即每个参与者)最后一个非NA列的名称(即他们完成的最后一个问题的名称) 2) 第二个新列,列出

简要数据集描述:我有从Qualtrics生成的调查数据,我已将其作为TIBLE导入R。每列对应一个调查问题,我保留了原始的列顺序(与调查中问题的顺序相对应)

简单语言问题:由于正常的参与者流失,并非所有参与者都完成了调查中的所有问题。我想知道每个参与者在调查中走了多远,以及他们在停下来之前回答的最后一个问题

R:中的问题陈述我要生成(使用tidyverse):

  • 1) 一个新列(lastq),列出每行(即每个参与者)最后一个非NA列的名称(即他们完成的最后一个问题的名称)
  • 2) 第二个新列,列出lastq中列的编号

示例数据帧df

df <- tibble(
  year = c(2015, 2015, 2016, 2016),
  grade = c(1, NA, 1, NA),
  height = c("short", "tall", NA, NA),
  gender = c(NA, "m", NA, "f")
 )
  # A tibble: 4 x 4
   year grade height gender
  <dbl> <dbl>  <chr>  <chr>
1  2015     1  short   <NA>
2  2015    NA   tall      m
3  2016     1   <NA>   <NA>
4  2016    NA   <NA>      f
   # A tibble: 4 x 6
   year grade height gender  lastq lastqnum
  <dbl> <dbl>  <chr>  <chr>  <chr>    <dbl>
1  2015     1  short   <NA> height        3
2  2015    NA   tall      m gender        4
3  2016     1   <NA>   <NA>  grade        2
4  2016    NA   <NA>      f gender        4
df%map(其中(!是.na())
  • ds%>%
    地图(尾部(!is.na(.),2))
  • ds%>%
    行()
    变异(last=哪个(!is.na(ds)))
  • ?



    非常感谢你的帮助

    按照James的建议编写一个解决问题的函数,但要更加健壮(处理所有答案都为NA的情况)

    L
    使0成为整数,而不是数字。为了提高速度(当有许多行时),请使用matrixStats包

    f1 = function(df) {
        idx = ifelse(is.na(df), 0L, col(df))
        matrixStats::rowMaxs(idx, na.rm=TRUE)
    }
    
    按照markus的建议在dplyr上下文中使用此选项

    mutate(df, lastqnum = f1(df), lastq = c(NA, names(df))[lastqnum + 1])
    df %>% mutate(lastqnum = f1(.), lastq = c(NA, names(.))[lastqnum + 1])
    
    还是就这么做

    lastqnum = f1(df)
    cbind(df, lastq=c(NA, names(df))[lastqnum + 1], lastqnum)
    
    验收后编辑我想整理方法首先是将数据整理成长格式

    df1 = cbind(gather(df), id = as.vector(row(df)), event = as.vector(col(df)))
    
    然后分组总结

    group_by(df1, id) %>%
        summarize(lastq = tail(event[!is.na(value)], 1), lastqname = key[lastq])
    

    当这里没有答案时,这不能处理这种情况。

    max(它是(!is.na(ds)))
    ?我不确定这是否遵循idomatic tidyverse,因为使用了ifelse而不是if\u else,cbind而不是bind\u cols,等等。
    group_by(df1, id) %>%
        summarize(lastq = tail(event[!is.na(value)], 1), lastqname = key[lastq])