首页 > 解决方案 > 使用字符串和同一 df 中的另一个变量构造变量名称,然后在 R 中更新其值

问题描述

我正在尝试df使用带有字符串的构造名称和同一数据框中的另一个变量来更新所选变量中的变量。

说我df的是:

 df
  y index
1 4     1
2 8     5
3 4     3
4 6     2

我向其中添加了五个变量 m.1 到 m.5:

> df
  y index m.1 m.2 m.3 m.4 m.5
1 4     1   0   0   0   0   0
2 8     5   0   0   0   0   0
3 4     3   0   0   0   0   0
4 6     2   0   0   0   0   0

使用这样的东西:

createvars <- function(df, n) { mutate(df, "m.{n}" := 0) }
for(i in 1:max(df$index)) {df <- createvars(df, n=i)}

我想m.{n} := index根据看起来像这样的条件使用类似这样的东西更新变量 m.1 到 m.5 {n} == index

结果应如下所示:

> df
  y index m.1 m.2 m.3 m.4 m.5
1 4     1   1   0   0   0   0
2 8     5   0   0   0   0   5
3 4     3   0   0   3   0   0
4 6     2   0   0   0   4   0

请注意,在实际示例/应用程序中:

  1. 变量的数量m.取决于样本,可以是几百个,
  2. 变量中的值m.将是 中的函数index和其他变量df
  3. df遗嘱最终会被使用,lm(y~)这可能不是正确的方法。

任何建议如何做到这一点?

感谢吨的任何建议!!!!

标签: rdataframedplyr

解决方案


row/column索引更容易base R

# // create the 'm.' columns with 0 values
nm1 <- paste0('m.', 1:5)
df[nm1] <- 0
# // assign the elements that corresponds to row/column index with index
df[nm1][cbind(seq_len(nrow(df)), df$index)] <- df$index

-输出

df
#  y index m.1 m.2 m.3 m.4 m.5
#1 4     1   1   0   0   0   0
#2 8     5   0   0   0   0   5
#3 4     3   0   0   3   0   0
#4 6     2   0   2   0   0   0

或者另一个选项model.matrix来自base R

df[nm1] <- model.matrix(~ factor(df$index, levels = 1:5) - 1) * df$index

或者修改函数createvars并使用for循环

library(stringr)
createvars <- function(data, n) {
    data %>% 
      mutate(!! str_c('m.', n) :=  case_when(index == n ~ index, TRUE ~ 0L ))
 }
for(i in seq_len(max(df$index))) df <- createvars(df, i)

或者另一个选项rowwiseunnest

library(tidyr)
library(dplyr)
mx <- max(df$index)
df %>%
   rowwise %>%
   mutate(new = list(replace(numeric(mx), index, index))) %>% 
   ungroup %>%
   unnest_wider(c(new)) %>% 
   rename_at(vars(starts_with("..")), ~ str_c('m.', seq_along(.)))

数据

df <- structure(list(y = c(4L, 8L, 4L, 6L), index = c(1L, 5L, 3L, 2L
)), class = "data.frame", row.names = c("1", "2", "3", "4"))

推荐阅读