【问题标题】:Is there a way to match two different data frames for multiple columns有没有办法为多列匹配两个不同的数据框
【发布时间】:2019-11-30 19:11:24
【问题描述】:

我想根据条件在列之间建立链接。我有两个数据框如下:

df1<-read.table(text=" gol
4
7
6
9
",header=TRUE)

第二个df是:

df2<-read.table(text=" cost1	cost2	cost3	cost4
7	9	5	13
3	12	4	14
9	13	3	11
5	6	2	13
4	3	5	12
8	16	6	9
9	11	2	9
6	14	11	12
5	10	14	6
2	9	4	12

",header=TRUE)

条件例如df2中cost1,如果df1中的值大于等于4,则取“y”,否则取“n”。在成本 2 中,如果 df1 中的值大于或等于 7,则为“y”,否则为“n”,依此类推。请假设我有超过四列。

结果如下:

output<-read.table(text=" cost1	cost2	cost3	cost4	out1	out2	out3	out4
7	9	5	13	y	y	n	y
                   3	12	4	14	n	y	n	y
                   9	13	3	11	y	y	n	y
                   5	6	2	13	y	n	n	y
                   4	3	5	12	y	n	n	y
                   8	16	6	9	y	y	y	y
                   9	11	2	9	y	y	n	y
                   6	14	11	12	y	y	y	y
                   5	10	14	6	y	y	y	n
                   2	9	4	12	n	y	n	y
                   ",header=TRUE)

我现在需要使用 ifelse 来完成,但在这个例子中我很难做到。您的帮助非常感谢。

【问题讨论】:

    标签: r if-statement conditional-statements


    【解决方案1】:

    这是一个不使用for-loop的解决方案:

    r <- setNames(data.frame(as.matrix(df2)>=outer(rep(1,nrow(df2)),df1$gol)),
                  paste0("out",seq(ncol(df2))))
    r[r==T] <- "y"
    r[r==F] <- "n"
    res <- cbind(df2,r)
    

    给出:

    > res
       cost1 cost2 cost3 cost4 out1 out2 out3 out4
    1      7     9     5    13    y    y    n    y
    2      3    12     4    14    n    y    n    y
    3      9    13     3    11    y    y    n    y
    4      5     6     2    13    y    n    n    y
    5      4     3     5    12    y    n    n    y
    6      8    16     6     9    y    y    y    y
    7      9    11     2     9    y    y    n    y
    8      6    14    11    12    y    y    y    y
    9      5    10    14     6    y    y    y    n
    10     2     9     4    12    n    y    n    y
    

    【讨论】:

      【解决方案2】:

      我可能还没有想到更好、更优雅的解决方案,但是使用带有ifelse 函数的for 循环,您可以执行以下操作:

      dfx <- data.frame(matrix(ncol=ncol(df2),nrow = nrow(df2)))
      for(i in 1:ncol(df2))
      {
        dfx[,i] <- ifelse(df2[,i] >= df1[i,1],"y","n")
        colnames(dfx)[i] <- paste0("out",i)
      }
      out <- cbind(df2,dfx)
      

      你会得到以下输出:

      > out
         cost1 cost2 cost3 cost4 out1 out2 out3 out4
      1      7     9     5    13    y    y    n    y
      2      3    12     4    14    n    y    n    y
      3      9    13     3    11    y    y    n    y
      4      5     6     2    13    y    n    n    y
      5      4     3     5    12    y    n    n    y
      6      8    16     6     9    y    y    y    y
      7      9    11     2     9    y    y    n    y
      8      6    14    11    12    y    y    y    y
      9      5    10    14     6    y    y    y    n
      10     2     9     4    12    n    y    n    y
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2015-11-10
        • 2021-01-15
        相关资源
        最近更新 更多