如何使用动态名称计算R数据框中的多个新列

雷莫

我正在尝试使用取自向量的动态新名称在R数据框中生成多个新列/变量。新变量是根据单个列的组/级别计算的。数据框包含沿深度(z的不同化学元素(元素)的测量值(计数)。通过将某个深度的每个元素的计数除以同一深度的代理元素(代理的相应计数来计算新变量

如果我只想创建一个新列/显式命名这些列,那么已经有一种使用mutate的解决方案有效(请参见下面的代码)。我正在寻找一种通用的解决方案,以在闪亮的Web应用程序中使用,其中代理不是字符串,而是字符串的向量,并且会根据用户输入动态变化。

# Working code for just one new column at a time (here Ti_ratio)

proxies <- "Ti"
df <- tibble(z = rep(1:10, 4), element = rep(c("Ag", "Fe", "Ca", "Ti"), each = 10), counts = rnorm(40))

df_Ti <- df %>%
  group_by(z) %>%
  mutate(Ti_ratio = counts/counts[element %in% proxies])
# Not working code for multiple columns at a time

proxies <- c("Ca", "Fe", "Ti")
varname <- paste(proxies, "ratio", sep = "_")

df_ratios <- df %>%
  group_by(z) %>%
  map(~ mutate(!!varname = .x$counts/.x$counts[element %in% proxies]))

工作代码输出:

> head(df_Ti)
# A tibble: 6 x 4
# Groups:   z [6]
      z element counts Ti_ratio
  <int> <chr>    <dbl>    <dbl>
1     1 Ag       2.41     4.10 
2     2 Ag      -1.06    -0.970
3     3 Ag      -0.312   -0.458
4     4 Ag      -0.186    0.570
5     5 Ag       1.12    -1.38 
6     6 Ag      -1.68    -2.84

不工作代码的预期输出:

> head(df_ratios)
# A tibble: 6 x 6
# Groups:   z [6]
      z element counts Ca_ratio Fe_ratio Ti_ratio
  <int> <chr>    <dbl>    <dbl>    <dbl>    <dbl>
1     1 Ag       2.41     4.78   -10.1      4.10 
2     2 Ag      -1.06     3.19     0.506   -0.970
3     3 Ag      -0.312   -0.479   -0.621   -0.458
4     4 Ag      -0.186   -0.296   -0.145    0.570
5     5 Ag       1.12     0.353    3.19    -1.38 
6     6 Ag      -1.68    -2.81    -0.927   -2.84 

编辑:我找到了base R使用两个嵌套的for循环来解决我的问题的一般解决方案,类似于@fra发布的答案(不同之处在于,在这里我遍历了深度和代理):

library(tidyverse)
df <- tibble(z = rep(1:3, 4), element = rep(c("Ag", "Ca", "Fe", "Ti"), each = 3), counts = runif(12)) %>% arrange(z, element)
proxies <- c("Ca", "Fe", "Ti")

for (f in seq_along(proxies)) {
  proxy <- proxies[f]
  tmp2 <- NULL
  for (i in unique(df$z)) {
    tmp <- df[df$z == i,]
    tmp <- as.data.frame(tmp$counts/tmp$counts[tmp$element %in% proxy])
    names(tmp) <- paste(proxy, "ratio", sep = "_")
    tmp2 <- rbind(tmp2, tmp)
  }
  df[, 3 + f] <- tmp2
}

以及正确的输出:

> head(df)
# A tibble: 6 x 6
      z element counts Ca_ratio Fe_ratio Ti_ratio
  <int> <chr>    <dbl>    <dbl>    <dbl>    <dbl>
1     1 Ag      0.690    0.864      9.21    1.13 
2     1 Ca      0.798    1         10.7     1.30 
3     1 Fe      0.0749   0.0938     1       0.122
4     1 Ti      0.612    0.767      8.17    1    
5     2 Ag      0.687    0.807      3.76    0.730
6     2 Ca      0.851    1          4.66    0.904

我使数据框包含的数据更少,因此可以清楚地看到为什么此解决方案正确(元素本身的比率= 1)。我仍然对可以用于管道的更优雅的解决方案感兴趣。

马特

一种tidyverse选择是创建一个类似于原始代码的函数,然后通过使用map_dfc来创建新列。

library(tidyverse)

proxies <- c("Ca", "Fe", "Ti")

your_func <- function(x){

    df %>% 
       group_by(z) %>%
       mutate(!!paste(x, "ratio", sep = "_") := counts/counts[element %in% !!x]) %>% 
       ungroup() %>%
       select(!!paste(x, "ratio", sep = "_") )
}

df %>% 
   group_modify(~map_dfc(proxies, your_func)) %>% 
   bind_cols(df, .) %>%
   arrange(z, element)


#       z element  counts Ca_ratio Fe_ratio Ti_ratio
#   <int> <chr>     <dbl>    <dbl>    <dbl>    <dbl>
# 1     1 Ag      -0.112   -0.733    -0.197   -1.51 
# 2     1 Ca       0.153    1         0.269    2.06 
# 3     1 Fe       0.570    3.72      1        7.66 
# 4     1 Ti       0.0743   0.485     0.130    1    
# 5     2 Ag       0.881    0.406    -6.52    -1.49 
# 6     2 Ca       2.17     1       -16.1     -3.69 
# 7     2 Fe      -0.135   -0.0622    1        0.229
# 8     2 Ti      -0.590   -0.271     4.37     1    
# 9     3 Ag       0.398    0.837     0.166   -0.700
#10     3 Ca       0.476    1         0.198   -0.836
# ... with 30 more rows

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用R中的计算在数据框中添加新列?

如何在R中使用新名称反复向数据框中添加新列?

如何引用多个数据框列来计算 R 中的加权平均值的新列

使用 R 中数据框列表中的数据框名称追加一个新列

使用for循环在数据框中创建新列以计算R中的值?

如何通过合并R中不同数据框中具有相同名称的列来创建新数据框?

如何在数据框中添加新的计算列?

在熊猫中使用动态名称创建新的数据框,并添加新列

使用dfList在多个数据框中创建新列

如何在R中动态选择数据框中的列

计算熊猫数据框中的新列

使用python在单独的数据框中查找的值来计算新数据框列中的值

如何将数据框列表转换为具有新列的数据框在R中显示列表名称

Python / Pandas-使用年份列名称动态计算数据框中的年比率

如何根据数据框 B 中的多个条件在数据框 A 中创建新列

如何在 R 的数据框中添加新列并使用现有列?

R中数据框列的动态突变,无法确定如何使用函数或循环

(R)我正在尝试使用if()语句引用数据框中的一列以计算其他多个列

如何选择具有多个条件的行并在原始数据框中计算新列

如何使用旧数据框中的值来计算新数据框?

计算跨多个数据框的新列

如何遍历 R 数据框中的列并在每次迭代中使用列名创建新数据框?

如何使用R合并具有多个列的数据框?

如何使用if else语句基于str值在r数据框中创建新列?

如何使用 Pandas 中的指定列创建新数据框?

使用 1 列中的值作为新数据框中的列名重塑 R 中的数据框

如何使用循环从多个熊猫数据框中删除列?

如何使用基数R函数对多个变量进行数据框排序,这些变量的名称在矢量中给出?

如何使用R中的分组交易创建新的数据框?