2017-05-24 71 views
0

我是R(約1周)的新手,有一個問題,我找不到答案。我有一個約100列的數據框,採取以下形式:根據R中的匹配列選擇值

x_1 x_2 x_3 ... x_50 y_1 y_2 y_3 ... y_50。

我需要檢查每個x列的值(比如說「01」),如果它存在於一行中,請從相應的y列中提取值。我可以很容易做到這一點是SAS與以下代碼:

data want; 
    set have; 

    array x[50] x_1 - x_50; 
    array y[50] y_1 - y_50; 
    do i = 1 to 50; 
     if x[i] = "01" then value = y[i]; 
     output; 
    end; 
run; 

有什麼建議嗎?

+2

您好,歡迎來到SO。請看看如何做一個[可重現的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Sotos

+0

最終'y [x == 「01」]' – jogo

回答

0

沒有測試

當你有一個數據集Y和X可以是這樣的:(他們當然需要具有相同的尺寸)

y[x=="01"] 
0

隨着data.table,該解決方案將工作:

library(data.table); library(rebus); 

#generate your table 
data <- data.table(a = 1:50, rowid = rep(1:50, each=50), x =round(runif(500)), y =round(runif(500))) 
data 
data <- dcast(data, rowid~a, value.var = c("x", "y")) 

### solution 

# meltdata 
meltdata <- melt(data, id.vars="rowid") 
# extract column names 
meltdata$part <- str_match(meltdata$variable, pattern = capture(ANY_CHAR) %R% "_" %R% capture(one_or_more(DGT)))[, 2] 
meltdata$number <- str_match(meltdata$variable, pattern = capture(ANY_CHAR) %R% "_" %R% capture(one_or_more(DGT)))[, 3] 
# seperate x and y tables 
xvalue <- meltdata[part == "x", .(rowid, number, xvalue = value)] 
yvalue <- meltdata[part == "y", .(rowid, number, yvalue = value)] 
#merge x and y tables 
mergeddata <- merge(xvalue, yvalue, by=c("rowid", "number")) 

由於您沒有共享您的數據,因此還有額外的工作,但我認爲它運行良好。

0

可能不是最有效的方法,但假設您需要像使用SAS示例一樣循環處理,這可能會產生您正在尋找的結果。

for(i in 1:length(colnames(df))){ 
    col <- colnames(df)[i] 
    if(startsWith(col,"x")){ 
    for(r in 1:nrow(df)) 
    { 
     if(df[r,col] == 1) 
     { 
     ycol <- sub("x","y",col) 
     yval <- df[r,ycol] 
     print(paste(col,"=",df[r,col],":",ycol,"=",yval)) 
     } 
    } 
    } 
}