2017-05-17 56 views
1

我對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

嘗試是否這可能工作:

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

完美的作品 - 謝謝! – Rasmus

+0

很棒的回答!這比使用for循環更優雅。 – Jon

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') 
) 

Adatadate列中的相應值將是a,等等。

現在你可以使用應用(以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 
+0

它也可以,謝謝! – Rasmus

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。

相關問題