2017-05-24 46 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)) 
     } 
    } 
    } 
}