首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用whichAreBijection命令从使用r的dataPreparation包中自动从数据帧中删除双射列

使用whichAreBijection命令从使用r的dataPreparation包中自动从数据帧中删除双射列
EN

Stack Overflow用户
提问于 2020-04-09 09:05:59
回答 1查看 106关注 0票数 0

我在做一个简单的任务时遇到了困难:

假设我使用这些库并拥有以下数据框架:

代码语言:javascript
复制
library(tidyverse)
library(dataPreparation)

df <- data.frame(col1 = 1, col2 = rnorm(1e1), col3 = sample(c(1, 2), 1e1, replace = TRUE))
df$col4 <- df$col2
df$col5[df$col3 == 1] = "a"
df$col5[df$col3 == 2] = "b"
df$col6 = c("b","b","a","a","b","a","a","a","a","b")
df$col7 = "d"
df$col8 = c(3,3,5,5,3,5,5,5,5,3)
df$col9 = c("x","x","y","y","x","y","y","y","y","x")
df$col10 = c("p","p","q","p","q","q","p","p","q","q")
df$col11 = c(10.5,10.5,11.37,10.5,11.37,11.37,10.5,10.5,11.37,11.37)
df <- df %>% mutate_if(is.character,as.factor)

使用下面的命令,我希望从df中删除列4、5、7、8、9、11。

代码语言:javascript
复制
whichAreBijection(df)
[1] "whichAreBijection: col7 is a bijection of col1. I put it in drop list."
[1] "whichAreBijection: col4 is a bijection of col2. I put it in drop list."
[1] "whichAreBijection: col5 is a bijection of col3. I put it in drop list."
[1] "whichAreBijection: col8 is a bijection of col6. I put it in drop list."
[1] "whichAreBijection: col9 is a bijection of col6. I put it in drop list."
[1] "whichAreBijection: col11 is a bijection of col10. I put it in drop list."
[1] "whichAreBijection: it took me 0.08s to identify 6 column(s) to drop."
[1]  4  5  7  8  9 11

我可以通过使用

代码语言:javascript
复制
df$col4 = NULL
df$col5 = NULL
df$col7 = NULL
df$col8 = NULL
df$col9 = NULL
df$col11 = NULL

但是,我想要算法自动完成它。

首先,我尝试生成包含whichAreBijection提议的列号的数据帧m,然后最终将其从df中删除,但结果却没有显示出任何地方:

代码语言:javascript
复制
x <- whichAreBijection(df)
y <- length(x)

m <- as.data.frame(matrix(0, ncol = y, nrow = nrow(df)))
i = 1
while (i< y+1) {
  # z <- names(df)[x[i]]
  m[,i] <- df[,x[i]]
  i<- i+1
}

以上所述生成的m具有由4、5、7、8、9、11提供的常量条目。

我看到使用一个简单的命令,如

代码语言:javascript
复制
m[,1] <- df[,4]

将m的第一列完全替换为df的第4列。

我遇到的第二个问题是在m中使用与df相同的列名。也许这听起来是完成简单任务的很长一段路。

为什么没有在m中准确地替换列? whichAreBijection?

  • 如何自动让m选择要删除的df的列名作为列名?

  • 是否有更好的方法来避免这种混乱,并直接删除由提出的列名?
EN

回答 1

Stack Overflow用户

发布于 2020-04-10 17:35:20

我能够用以下方法处理问题1:

代码语言:javascript
复制
x <- whichAreBijection(df)
y <- length(x)
m <- as.data.frame(matrix(0, ncol = y, nrow = nrow(df)))
i = 1
while (i< y+1) {
    m[,i] <- df[,x[i], with = FALSE]
    i<- i+1
}

似乎命名的列索引值不起作用,而整数列索引则在右侧工作,我的意思是xi。这个麻烦可以通过在结尾处设置为= FALSE来避免。

问题2是下一个挑战。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61117577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档