我有一个如下所示的数据框:
df<-data.frame(H0=c(35.4, NA, 36.0, 36.4), H1=c(32.3, 32.0, 34.3, 33.5),
H2=c(33.4, 31.5, 33, 34.2), H3=c(32.9, 33.0, 34.0, 33.0),
H4=c(32.8, NA, 34.5, 33.2))
我需要一个能够搜索每一行的函数,并返回值首次显示为&lt; = 33.0的列的数字(不是名称)。
NA被忽略,所以我希望:
[1] 2 2 3 4
答案 0 :(得分:2)
您的问题并没有说明您希望如何处理NA
或没有任何&lt;&lt; 33. max.col
可能足以完成你的任务:
R>df
H0 H1 H2 H3 H4
1 35.4 32.3 33.4 32.9 32.8
2 NA 32.0 31.5 33.0 NA
3 36.0 34.3 33.0 34.0 34.5
4 36.4 33.5 34.2 33.0 33.2
R>max.col(df <= 33, ties.method="first")
[1] 2 NA 3 4
编辑:要处理NA
,用Inf
替换它们应该可以解决问题:
R>max.col( `[<-`(df, is.na(df), value=Inf) <= 33, ties.method="first")
[1] 2 2 3 4
答案 1 :(得分:1)
您可以尝试match
,它会返回第一次出现的索引。
NA
被忽略,因为nomatch
的默认设置设为NA_integer_
> apply(df, 1, function(x) match(TRUE, x <= 33.0))
# [1] 2 2 3 4
答案 2 :(得分:0)
如果您想忽略NAs并在没有找到值的情况下放置NA,
rowSearcher <- function(df) {
colNumbers <- numeric(0) # Vector of column numbers to output
for (r in 1:ncol(df)) { # Loop through the rows
for (c in 1:ncol(df)) { # Loop through the columns
if (!is.na(df[r, c]) && df[r, c] <= 33.0) {
colNumbers <- c(colNumbers, c)
break
}
if (c == ncol(df)) # Add an NA if no value was found
colNumbers <- c(colNumbers, NA)
}
}
return(colNumbers)
}
答案 3 :(得分:0)
你也可以使用:
apply(df,1,function(x) Position(function(y) y <=33 & !is.na(y), x))
#[1] 2 2 3 4