我对r很新,并且遇到了一些代码问题。
我的数据框看起来像这样:
对于每一列,我想查找值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列,所以这不是一个选择。
我希望有人能够提供帮助,并提前致谢!
祝你好运 拉斯穆斯
答案 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。