【问题标题】:Selecting values based on matched columns in R根据 R 中的匹配列选择值
【发布时间】:2017-05-24 13:21:18
【问题描述】:

我是 R 新手(大约 1 周)并且有一个我找不到答案的问题。我有一个包含大约 100 列的数据框,格式如下:

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;

有什么建议吗?

【问题讨论】:

标签: r


【解决方案1】:

可能不是最有效的方法,但假设您需要像 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))
      }
    }
  }
}

【讨论】:

    【解决方案2】:

    未测试

    当你有一个数据集 y 和 x 时,你可以这样:(它们当然需要具有相同的维度)

    y[x=="01"]
    

    【讨论】:

      【解决方案3】:

      使用 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"))
      

      因为你没有分享你的数据,所以有额外的工作,但我认为它运作良好。

      【讨论】:

        猜你喜欢
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多