从多列中提取第一个值

问题描述:

我正在尝试在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 
+1

@Jim这就是我一开始以为的想法,但我认为这个问题确实是要求每一行中的第一个非缺失值。 – Gregor

这可以用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")

+0

感谢您的回复!当我运行的代码,你推荐我得到两列 - 列1采取第一个非缺失值,但列中剩余的单元格是空的。第二列第一个单元格为空,剩余的单元格填充第二个非缺失值 – victoria

+0

@victoria我不确定是否理解您的评论。该输出基于您提供的示例。在这里,我假定列是“角色”类 – akrun

您可以通过数据帧运行快速循环得到列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] 
} 

希望这会有所帮助!

我们可以使用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