我最近问了一个类似的问题here.然而,我有一个新的问题,我不能应用另一个答案.我正在try 基于名称向量更改列元素的名称.

我遇到的问题是,如果我有一个包含如下因素变量的数据框:

dfOG <- data.frame(
  x1 = c(1,4,2),
  x4 = as.factor(c('yes', 'no', 'maybe')),
  x5 = as.factor(c(rep('yes', 2), rep('no', 1))),
  x41 = as.factor(c(rep('hot', 1), rep('cold', 2)))
)

然后我正在应用三个过程中的一个.每个进程(不在我的控制范围之内)都会将这些因素分解为虚拟变量.但不幸的是,根据使用的过程,它会以不同的方式重命名假人.例如,下表显示了如何拆分x4,具体取决于使用的流程:

x41, x42, x43 = x4 # process 1
x4.yes, x4.no, x4.maybe = x4 # process 2
x4_yes, x4_no, x4_maybe = x4 # process 3

因此,进程1只是在末尾添加一个数字.流程2添加一个.,后跟因子级别.流程3添加一个_,后跟因子级别.

只关注进程1,在应用该进程之后,我得到了一个数据框,其中的列如下所示:

dfChange <- data.frame(
  name = c('x41', 'x43', NA, NA,
           'x411', NA, 'x52',
           'x42', 'x412', NA)
)

我正在try 将dfChange$name中元素的名称改回dfOG中的原始名称.

Desired Output

我想要的输出如下所示:

dfDesired <- data.frame(
  name = c('x4', 'x4', NA, NA, 
           'x41', NA, 'x5',
           'x4', 'x41', NA)
)

Attempted Solution

我实际上还没有一个解决方案,但以下是我正在try 的:

# find out which columns in my original data are factors
factorColNam <- names(which(!(sapply(dfOG[colnames(dfOG)], is.numeric))))
factorCols <- which((colnames(dfOG) %in% factorColNam))


# create a list of the variables split into their factors
dfnew <- list()
for (i in 1:length(factorCols)) {
  facLevels <- unique(dfOG[ ,factorCols[i]])
  dfnew[[i]] <- paste0(factorColNam[i],  as.numeric(facLevels))
}

# rename each element it's original name
names(dfnew) <- factorColNam

我的 idea 是遍历列表元素,比较dfChange$name中的名称,然后将它们重命名为它们所在的列表元素.但我相信一定有更简单、更好的方法来做到这一点?

EDIT

我忘了提到的一件事是,名称可以是任何名称,它们不限于x1, x2,...等.例如,我可以有一个名为x10的变量,具有10个因子水平,或者一个名为banana的变量,具有25个因子水平.任何名字都是可能的.

推荐答案

从您的代码继续:

dfChange$var <- NA
for (i in 1:length(dfnew)) {
  nn <- names(dfnew)
  dfChange$var[which(dfChange$name %in% dfnew[[i]])] <- nn[[i]]
}

R相关问答推荐

如何将在HW上运行的R中的消息(错误、警告等)作为批处理任务输出

带有叠加饼图系列的Highmap

在R中替换函数中的特定符号

如何使用R对每组变量进行随机化?

我不能在docker中加载sf

如何动态更新selectizeInput?

如何根据嵌套元素的名称高效而优雅地确定它属于哪个列表?

我如何才能找到FAMILY=POISSON(LINK=&Q;LOG&Q;)中的模型预测指定值的日期?

用关联字符串替换列名的元素

2个Rscript.exe可执行文件有什么区别?

根据现有列的名称和字符串的存在进行变异以创建多个新列

WRS2包中带有bwtrim的简单ANOVA抛出错误

使用geom_iles在一个切片中包含多个值

如何计算每12行的平均数?

多元正态分布的计算

R基于变量组合创建新的指标列

真实世界坐标的逆st_变换

如果缺少时间,如何向日期-时间列添加时间

使用相对风险回归计算RR

使用离散标签自定义图例,用于具有连续但已入库的数据的热图