从多列中提取第一个值
问题描述:
我正在尝试在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
答
这可以用max.col
row/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")
答
您可以通过数据帧运行快速循环得到列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
@Jim这就是我一开始以为的想法,但我认为这个问题确实是要求每一行中的第一个非缺失值。 – Gregor