【问题标题】:R - Return first value of row in df based on first occurence of column valueR - 根据列值的第一次出现返回 df 中行的第一个值
【发布时间】:2020-09-13 13:45:45
【问题描述】:

我有 6 列的 df:

      Time               A_1               A_2               A_3      mean      SEM
1 3.474000          0.000000          42.22222          46.29630  0.000000 0.000000
2 3.538333          0.000000          42.22222          46.29630  0.000000 0.000000
3 3.602667          0.000000          42.22222          50.00000  0.000000 0.000000
4 3.667000          3.030303          50.02156          51.85185  1.010101 1.010101
5 3.731333          3.030303          52.38745          77.77778  1.010101 1.010101
6 3.795667          3.030303          48.25852          77.77778  1.010101 1.010101

我想分别检查 A_1、A_2 和 A_3 列是否有第一个大于 49.9999 的值,并为该行返回时间列中的值。

我可以使用rowA1<-which.max(df$A_1 >49.9999) 获取每列的行索引,但我不确定如何从行索引获取该行的时间列值。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    您可以使用apply() 尝试此解决方案。首先识别具有模式A_ 的变量,然后您可以结合min()which() 以便在上述条件之后随时间提取该行。代码如下:

    #Code
    #Index for columns
    index <- which(grepl('A_',names(df)))
    #Apply
    res <- apply(df[,index],2,function(x) df$Time[min(which(x>49.9999))])
    

    输出:

    res
         A_1      A_2      A_3 
          NA 3.667000 3.602667 
    

    使用的一些数据:

    #Data
    df <- structure(list(Time = c(3.474, 3.538333, 3.602667, 3.667, 3.731333, 
    3.795667), A_1 = c(0, 0, 0, 3.030303, 3.030303, 3.030303), A_2 = c(42.22222, 
    42.22222, 42.22222, 50.02156, 52.38745, 48.25852), A_3 = c(46.2963, 
    46.2963, 50, 51.85185, 77.77778, 77.77778), mean = c(0, 0, 0, 
    1.010101, 1.010101, 1.010101), SEM = c(0, 0, 0, 1.010101, 1.010101, 
    1.010101)), class = "data.frame", row.names = c("1", "2", "3", 
    "4", "5", "6"))
    

    【讨论】:

    • 使用min()会产生警告信息。将min(which(x&gt;49.9999)) 替换为which(x&gt;49.9999)[1] 即可解决。
    【解决方案2】:

    使用dplyr,我们可以使用summarise + across

    library(dplyr)
    df %>% summarise(across(starts_with('A'), ~Time[which(. > 49.99)[1]]))
    
    #  A_1   A_2      A_3
    #1  NA 3.667 3.602667
    

    【讨论】:

    • 试过了,它抛出了一个错误:Error: across()` 只能在 dplyr 动词中使用。` 但我需要提高我的 dplyr 技能,所以我会玩它。感谢您花时间让我走上这条路!
    • @AlbertQuackstein 我想你也加载了plyr。尝试使用dplyr::summarise
    【解决方案3】:

    base R 选项与sapply

    sapply(df[startsWith(names(df), 'A')], function(x) df$Time[x > 49.999][1])
    # A_1      A_2      A_3 
    #  NA 3.667000 3.602667 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多