【问题标题】:extract first value from multiple columns从多列中提取第一个值
【发布时间】:2017-02-09 00:26:25
【问题描述】:

我正在尝试在 R 中执行此操作。它等效于 Stata egen 函数 rowfirst()

假设我有如下所示的四列(T1、T2、T3、T4)。我想创建一个新列 (TX),其中包含每行 T1:T4 列中的第一个元素。

ID T1 T2 T3 T4

A  0  2  4  5
B  .  .  6  5
C  .  8  6  1
D  .  .  .  9

ID TX
A   0
B   6
C   8
D   9

【问题讨论】:

  • @Jim 我一开始也是这么想的,但我认为问题实际上是要求每行中的第一个非缺失值。

标签: r matrix stata


【解决方案1】:

这可以通过使用max.colrow/column 索引来完成。假设缺失值为.

cbind(df1[1], TX=df1[-1][cbind(1:nrow(df1), max.col(df1[-1]!=".", "first"))])
#   ID TX
#1  A  0
#2  B  6
#3  C  8
#4  D  9

如果缺失值为NA,则使用max.col(!is.na(df1[-1]), "first")

【讨论】:

  • 感谢您的回复!当我运行您推荐的代码时,我得到两列 - 第 1 列采用第一个非缺失值,但该列中的剩余单元格为空。第二列第一个单元格为空,其余单元格填充第二个非缺失值
  • @victoria 我不确定我是否理解您的评论。此输出基于您提供的示例。在这里,我假设列为character class
【解决方案2】:

我们可以逐行使用apply 并检查哪些值不等于“。”并选择行中的最小值。

cbind(df[1], TX = apply(df[-1],1, function(x) x[min(which(x != "."))]))

#  ID TX
#1  A  0
#2  B  6
#3  C  8
#4  D  9

【讨论】:

    【解决方案3】:

    您可以通过数据框快速循环以获取 T1:T4 列中的第一个元素

    试试这个

    Data <- data.frame(ID=LETTERS[1:4], 
                       T1=c(0,".",".","."), 
    
                       T2=c(2,".",8,"."), 
                       T3=c(4,6,6,"."),
                       T4=c(5,5,1,9), stringsAsFactors=FALSE)
    
    NewData <- data.frame(ID=Data$ID, TX=NA, stringsAsFactors=FALSE)
    
    for(i in 1:nrow(NewData)){
      NewData$TX[i] <- Data[i,2:ncol(Data)][which(Data[i,2:ncol(Data)] != ".")][1]
    }
    

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2012-10-30
      • 2011-09-23
      • 2021-02-16
      • 1970-01-01
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多