代码之家  ›  专栏  ›  技术社区  ›  ChrissiLissi

我的功能有什么问题?使用匹配ID计算百分比

  •  0
  • ChrissiLissi  · 技术社区  · 2 年前

    这就是我试图构建的功能。 它应该基于相同的ID计算一个Df的列与另一个Df的列的百分比。

    # With dummy data 
    
    df1 = data.frame(State = c('Arizona AZ','Georgia GG', 'Newyork NY','Indiana IN','Florida FL'), Score=c(62,47,55,74,31), id=c(1,2,3,4,5))
    df1
    
    > df1
           State Score id
    1 Arizona AZ    62  1
    2 Georgia GG    47  2
    3 Newyork NY    55  3
    4 Indiana IN    74  4
    5 Florida FL    31  5
    
    df2 = data.frame(State = c('Arizona AZ','Georgia GG', 'Newyork NY','Indiana IN'), Score2=c(10,7,5,4), id=c(1,2,3,4))
    df2
    
    > df2
           State Score2 id
    1 Arizona AZ     10  1
    2 Georgia GG      7  2
    3 Newyork NY      5  3
    4 Indiana IN      4  4
    
    CalcPerc <- function(x, ins) {
      
      # 1) Subset + cbind
      y  <- subset(ins, id %in% x$id)
      y  <- cbind(y, x$Score)
      
      # Percentage
      x1 <- 100*(y$Score2/y$Score)
      
      print(x1)
    }
    
    CalcPerc(x= df2, ins = df1)
    
    [1] 4
    numeric(0) 
    
    

    为什么我会 数字(0) ?

    如何修复我的函数?

    如果我在函数外执行它,效果就很好。

    谢谢你的帮助!

    2 回复  |  直到 2 年前
        1
  •  3
  •   robertdj    2 年前

    尝试添加 browser() 之前的声明 print(x1) 并运行 CalcPerc(x= df2, ins = df1) 。 你会看到的 y

           State Score id x$Score
    1 Arizona AZ    62  1      10
    2 Georgia GG    47  2       7
    3 Newyork NY    55  3       5
    4 Indiana IN    74  4       4
    

    这就是为什么提到 y$Score 给出一个空向量——不存在这样的列。 我 犯罪嫌疑人 你真正想要的是 合并 两个数据帧。 带基数R:

    CalcPerc <- function(x, ins) {
        
        # 1) Subset + cbind
        y  <- subset(ins, id %in% x$id)
        
        z <- merge(x, y, by = c('State', 'id'))
        
        x1 <- 100*(z$Score2/z$Score)
        
        print(x1)
    }
    
        2
  •  3
  •   Necklondon    2 年前

    尝试以下操作:

    CalcPerc <- function(x, ins) {
          # 1) Subset + cbind
          y  <- subset(ins, id %in% x$id)
          y$Score2 = x$Score2
          x1 <- 100*(y$Score2/y$Score)
          print(x1)
       }
       > CalcPerc(x= df2, ins = df1)
       [1] 16.129032 14.893617  9.090909  5.405405
    

    答案将按正确的顺序排列

        3
  •  1
  •   Quinten    2 年前

    @robertdj和@Necklondon修复了您的错误。如果你想 dplyr 选项您可以根据id和状态加入数据,并且 mutate 计算百分比的列,以便您立即看到百分比在数据帧中对应的状态:

    library(dplyr)
    df1 %>%
      left_join(df2, by = c("id", "State")) %>%
      mutate(Perc = 100*(Score2/Score))
    

    输出:

           State Score id Score2      Perc
    1 Arizona AZ    62  1     10 16.129032
    2 Georgia GG    47  2      7 14.893617
    3 Newyork NY    55  3      5  9.090909
    4 Indiana IN    74  4      4  5.405405
    5 Florida FL    31  5     NA        NA