r-在for循环中突变



我有一个类似的数据帧

structure(list(a = c(1, 3, 4, 6, 3, 2, 5, 1), b = c(1, 3, 4, 
2, 6, 7, 2, 6), c = c(6, 3, 6, 5, 3, 6, 5, 3), d = c(6, 2, 4, 
5, 3, 7, 2, 6), e = c(1, 2, 4, 5, 6, 7, 6, 3), f = c(2, 3, 4, 
2, 2, 7, 5, 2)), .Names = c("Love_ABC", "Love_CNN", "Hate_ABC", "Hate_CNN", "Love_CNBC", "Hate_CNBC"), row.names = c(NA, 
8L), class = "data.frame")

我已经为环路做了以下操作

channels = c("ABC", "CNN", "CNBC")
for (channel in channels) { 
dataframe <- dataframe %>%
mutate(ALL_channel = Love_channel + Hate_channel)
}

但是当我运行for循环R时;object Love_ channel";找不到。我在for循环中做错了什么吗?

以下是使用rlang的方法。请注意,重塑数据可能更简单。非标准评价是一个复杂的课题。

for (channel in channels) { 
DF <- DF %>%
mutate(!!sym(paste0("ALL_", channel)) := !!sym(paste0("Love_", channel)) + !!sym(paste0("Hate_", channel)))
}
DF
##   Love_ABC Love_CNN Hate_ABC Hate_CNN Love_CNBC Hate_CNBC ALL_ABC ALL_CNN ALL_CNBC
## 1        1        1        6        6         1         2       7       7        3
## 2        3        3        3        2         2         3       6       5        5
## 3        4        4        6        4         4         4      10       8        8
## 4        6        2        5        5         5         2      11       7        7
## 5        3        6        3        3         6         2       6       9        8
## 6        2        7        6        7         7         7       8      14       14
## 7        5        2        5        2         6         5      10       4       11
## 8        1        6        3        6         3         2       4      12        5

这是一个具有dplyrtidyr:的解决方案

library(tidyr)
library(dplyr)
dataframe <- dataframe %>%
tibble::rowid_to_column()
dataframe %>% 
pivot_longer(-rowid, names_to = c(NA, "channel"), names_sep = "_") %>% 
pivot_wider(names_from = channel, names_prefix = "ALL_", values_from = value, values_fn = sum) %>% 
right_join(dataframe, by = "rowid") %>% 
select(-rowid)
#> # A tibble: 8 x 9
#>   ALL_ABC ALL_CNN ALL_CNBC Love_ABC Love_CNN Hate_ABC Hate_CNN Love_CNBC Hate_CNBC
#>     <dbl>   <dbl>    <dbl>    <dbl>    <dbl>    <dbl>    <dbl>     <dbl>     <dbl>
#> 1       7       7        3        1        1        6        6         1         2
#> 2       6       5        5        3        3        3        2         2         3
#> 3      10       8        8        4        4        6        4         4         4
#> 4      11       7        7        6        2        5        5         5         2
#> 5       6       9        8        3        6        3        3         6         2
#> 6       8      14       14        2        7        6        7         7         7
#> 7      10       4       11        5        2        5        2         6         5
#> 8       4      12        5        1        6        3        6         3         2

我们的想法是重塑它,使求和更容易。然后,您可以将最终结果连接回初始数据帧。

  • 首先用rowid唯一地标识每一行
  • pivot_longer重新整形,使所有值整齐地放在一列中。在这一步中,您还将名称Love/Hate_channel一分为二,并删除Love/Hate部分(您只对频道感兴趣([这就是NA的作用!]
  • 再次整形:这一次您希望为每个通道获得一列。在这一步中,您还为每个rowid和通道总结了以前的LoveHate(这就是values_fn=sum的作用!(。此外,您还可以为每个新列名添加一个前缀(names_prefix = "ALL_"(,以使其名称符合预期的最终结果
  • 使用right_join,可以将值添加回原始数据帧。您现在不需要rowid,所以可以将其删除

最新更新