【问题标题】:run function on every row of dataframe, store result in new column, R在数据帧的每一行上运行函数,将结果存储在新列中,R
【发布时间】:2021-12-03 12:06:19
【问题描述】:

我想在数据帧的每一行上运行函数 sum_differences 并将结果存储在新列“di_Flex”中。 a 是列Company ID,每个公司ID 存在多行。 b 是列max_di_Flex。谁能帮我解决for循环?谢谢!

data <- df <- data.frame(structure(list(`Company ID` = c(0, 0, 0, 0, 0, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6), Action = c(5, 5, 2, 4, 5, 5, 3, 1, 5, 7, 2, 4, 2, 6, 2, 3, 1, 4, 1, 5), Flexibility_Thinking = c(7, 2, 5, 1, 6, 5, 7, 7, 4, 7, 5, 2, 3, 3, 3, 3, 4, 3, 6, 6), max_di_Flex = c(12.8, 12.8, 12.8, 12.8, 12.8, 8, 8, 8, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16))))
data <- data %>% group_by(`Company ID`) %>% filter(length(`Company ID`) > 1)
data <- data %>% drop_na(`Flexibility_Thinking`)

sum_differences <- function(a,b) {
  a <- unique(a)
  new_list <- c()

  for (i in a) {
    for (j in a) {
      if(i != j) {
        new_list <- c(new_list, abs(i-j))
      }
    }
  }
  outcome <- round((sum(new_list) / length(a)), 2)
  percent <- outcome/b
  return(percent)
}

【问题讨论】:

    标签: r dataframe function


    【解决方案1】:

    试试:

    data$di_Flex <- apply(data, 1, function(x) sum_differences(x[1], x[3]))
    

    或者:

    data$di_Flex <- apply(as.data.frame(data), 1, function(x) sum_differences(x[1], x[3]))
    

    【讨论】:

    • 谢谢!我得到的“di_Flex”列中填充了“”,所以很遗憾它不起作用,你知道为什么吗?
    • @Theresa_S 试试看:cbind(data, apply(as.data.frame(data), 1, function(x) sum_differences(x[1], x[3])))
    • 这可行,但给了我错误的结果,我在特定公司 ID 上运行该函数时检查了正确的结果,而不是循环遍历所有这些 :(
    • 还是不行,我更新了数据和函数,也许现在更清楚了?谢谢!!
    【解决方案2】:

    使用 map2_dbl 的 Tidyverse 解决方案(当您有一个接受 2 个输入并返回一个数字的函数时):

    df <- as.data.frame(data)
    library(tidyverse)
    df %>%
        mutate(diFlex = map2_dbl(Company.ID, max_di_Flex, sum_differences))
    #>    Company.ID Flexibility_Thinking max_di_Flex diFlex
    #> 1           0                    7        12.8      0
    #> 2           0                    2        12.8      0
    #> 3           0                    5        12.8      0
    #> 4           0                    1        12.8      0
    #> 5           0                    6        12.8      0
    #> 6           1                    3         0.0    NaN
    #> 7           2                    6         0.0    NaN
    #> 8           3                    6         0.0    NaN
    #> 9           4                    7         0.0    NaN
    #> 10          5                    5         8.0      0
    #> 11          5                    7         8.0      0
    #> 12          5                    7         8.0      0
    #> 13          6                    4        16.0      0
    #> 14          6                    7        16.0      0
    #> 15          6                    5        16.0      0
    #> 16          6                    2        16.0      0
    #> 17          6                    3        16.0      0
    #> 18          6                    3        16.0      0
    #> 19          6                    3        16.0      0
    #> 20          6                    3        16.0      0
    

    编辑

    从我在另一个答案中看到的 cmets 中,我意识到该函数采用向量而不是单个值。这意味着您不需要循环,而应该直接在向量上调用函数:

    df %>%
        mutate(diFlex = sum_differences(df$Company.ID, df$max_di_Flex))
    #>    Company.ID Flexibility_Thinking max_di_Flex diFlex
    #> 1           0                    7        12.8   1.25
    #> 2           0                    2        12.8   1.25
    #> 3           0                    5        12.8   1.25
    #> 4           0                    1        12.8   1.25
    #> 5           0                    6        12.8   1.25
    #> 6           1                    3         0.0    Inf
    #> 7           2                    6         0.0    Inf
    #> 8           3                    6         0.0    Inf
    #> 9           4                    7         0.0    Inf
    #> 10          5                    5         8.0   2.00
    #> 11          5                    7         8.0   2.00
    #> 12          5                    7         8.0   2.00
    #> 13          6                    4        16.0   1.00
    #> 14          6                    7        16.0   1.00
    #> 15          6                    5        16.0   1.00
    #> 16          6                    2        16.0   1.00
    #> 17          6                    3        16.0   1.00
    #> 18          6                    3        16.0   1.00
    #> 19          6                    3        16.0   1.00
    #> 20          6                    3        16.0   1.00
    

    【讨论】:

    • 没用 :( 我刚刚更新了数据和函数,你有没有其他方法可以解决这个问题?
    • 与其发布您的功能,您能否展示您想要的结果?
    • 您的意思是期望的结果值吗?对于公司 ID 0:1,公司 ID 5:0,25,公司 ID 6:0,729
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-21
    • 2017-06-26
    • 2013-02-05
    • 2021-11-02
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多