r - 使用字符串和同一 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
请注意,在实际示例/应用程序中:
- 变量的数量
m.
取决于样本,可以是几百个, - 变量中的值
m.
将是 中的函数index
和其他变量df
, df
遗嘱最终会被使用,lm(y~)
这可能不是正确的方法。
任何建议如何做到这一点?
感谢吨的任何建议!!!!
解决方案
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)
或者另一个选项rowwise
和unnest
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"))
推荐阅读
- c++11 - 有人能告诉我为什么我收到“检测到堆损坏”错误吗?
- r - 生成带有 have 标记数据的漂亮 kable 样式表
- django - raise TypeError("%s() 得到了一个意外的关键字参数 '%s'"
- javascript - 如果日期不在数组中,如何插入日期
- c# - 异步/等待示例
- laravel - 在同一服务器的子目录中托管多个 laravel 项目
- javascript - 尝试运行 npm install discord.io winston -save 时出错
- excel - 如何将此代码从使用 5 个常量更改为它们的平均值?
- python - 尝试除了不赶上功能?
- vue.js - 我可以使用使用 VueX 的组件,而我的应用程序也使用 VueX 吗?