【问题标题】:How to create columns from anothers columns?如何从另一列创建列?
【发布时间】:2020-01-07 01:43:36
【问题描述】:

我想从 df1 构建一个像 df2 这样的数据框,始终寻找值最接近 0 的列的名称: Where clossets_1 - 更接近 x、y 和 z 列的 0 的值。 clossets_2 - 列 x 和 a 中更接近 0 的值,因为 x 是 clossets_1 中接收最多的值。 clossets_3 - a 和 b 列中更接近 0 的值,因为 a 是 clossets_2 中接收最多的值。

df1

df1
#  x  y  z  a  b 
#1 1  2  3  4  3 
#2 2  3  4  1  2 
#3 3  2  4  2  1 
#4 4  3  2  3  6

愿望输出:

df2 
#  x  y  z clossets_1 a clossets_2 b clossets_3
#1 1  2  3     x      4     x      3    b
#2 2  3  4     x      1     a      2    a 
#3 3  2  4     y      2     a      1    b 
#4 4  3  2     z      3     a      2    b

【问题讨论】:

    标签: r dataframe compare


    【解决方案1】:

    这是开始的第一步:

    cols = c("x","y","z")
    df2 = df1
    df2$clossets_1 = cols[apply(df1[,cols], 1, function(x) {which(x == min(x))})]
    df2
    ##   x y z a b clossets_1
    ## 1 1 2 3 4 3          x
    ## 2 2 3 4 1 2          x
    ## 3 3 2 4 2 1          y
    ## 4 4 3 2 3 6          z
    

    【讨论】:

      【解决方案2】:

      我是这样解决的,使用@BigFinger answer的第一步和包modeest中的mlv()函数在最接近的列中找到重复次数最多的值

      library(DescTools) 
      library(modeest) 
      library(tibble) 
      
      df1 = tibble(x = c(1,2,3,4),
                   y = c(2,3,2,3),
                   z = c(3,4,4,2),
                   clossest_1 = c("x","y","z")[apply(data.frame(x,y,z),1,function(x){which(x == Closest(x,0))})],
                   a = c(4,1,2,3),
                   clossest_2 = c(mlv(clossest_1),"a")[apply(data.frame(get(mlv(clossest_1)),a),1,function(x){which(x == Closest(x,0))})],
                   b = c(3,2,1,2),
                   clossest_3 = c(mlv(clossest_2),"b")[apply(data.frame(get(mlv(clossest_2)),b),1,function(x){which(x == Closest(x,0))})])
      df1
      # A tibble: 4 x 8
      #      x     y     z clossest_1     a clossest_2     b clossest_3
      #  <dbl> <dbl> <dbl> <chr>      <dbl> <chr>      <dbl> <chr>     
      #1     1     2     3 x              4 x              3 b         
      #2     2     3     4 x              1 a              2 a         
      #3     3     2     4 y              2 a              1 b         
      #4     4     3     2 z              3 a              2 b         
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 2020-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多