查找除1之外的每个列中的值,并使用r从最后一列返回一个值

时间:2017-05-17 16:43:10

标签: r

我对r很新,并且遇到了一些代码问题。

我的数据框看起来像这样: The data frame i'm using

对于每一列,我想查找值1982Q4并从列datadate返回相应的值。我尝试过使用代码:

Constituents_list <- colnames(datacqtr)
Constituents_list <- Constituents_list[-1]
Results <- 0
for(i in Constituents_list) {
Results <- cbind(Results, na.omit(with(datacqtr,datadate[Constituents_list== "1982Q4"])))
}

但它不起作用。如果我自己使用代码

编写列名,我可以成功获得一个值
Results <- cbind(Results, na.omit(with(datacqtr,datadate[`6307`== "1982Q4"])))

但是因为我有超过3000列,所以这不是一个选择。

我希望有人能够提供帮助,并提前致谢!

祝你好运 拉斯穆斯

3 个答案:

答案 0 :(得分:3)

尝试这是否有效:

apply(datacqtr[,-1], 2, function(x) datacqtr$datadate[grepl("1982Q4",x)])

答案 1 :(得分:1)

模拟小型数据框:

df <- data.frame(
  datadate=c('a', 'b', 'c', 'd'),
  A=c('1982Q4', NA, NA, NA),
  B=c(NA, '1982Q4', NA, NA),
  C=c(NA, NA, '1982Q4', NA),
  D=c(NA, NA, NA, '1982Q4')
)

A列中datadate列的对应值为a,依此类推。

现在你可以使用apply(在R中,避免使用for循环):

apply(df, 2, function(x) df$datadate[which(x=='1982Q4')])

输出:

$A
[1] a
Levels: a b c d

$B
[1] b
Levels: a b c d

$C
[1] c
Levels: a b c d

$D
[1] d
Levels: a b c d

答案 2 :(得分:1)

可能最快的方法是使用第一列作为查找表,然后使用max.col为每列提取所需的索引。

在@thebiro提供的示例中,您可以

df$datadate[max.col(df[-1] == "1982Q4" & !is.na(df[-1]))]
[1] a b c d
Levels: a b c d

在此,您必须使用==检查值,并确保该值不是NA。