首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将因子类别从一列合并为新列

将因子类别从一列合并为新列
EN

Stack Overflow用户
提问于 2017-07-13 18:40:10
回答 2查看 72关注 0票数 1

这是我第一次发问。我对R很陌生,我寻找答案已经有一段时间了,却没有找到答案。就这么办了。我有一个非常大的数据集(超过140 K的数据集),其中一列包含"programtype“的类别,选项如下:

  • 联邦机构
  • 联邦机构/大学
  • 国家调查方案
  • LTER
  • 大学
  • 非营利机构
  • 国家局
  • 国家机构/公民监测方案
  • 国家机构/大学/公民监测方案
  • 部落机构

我想要做的是创建一个新的列,在其中我合并一些类别在一起。我想:

  • 联邦机构、联邦机构/大学、国家调查计划改为联邦机构/大学
  • 大学改为 LTER /
  • 非营利机构转换为非盈利机构
  • 国家局改为国事局
  • 国家机构/公民监测方案、国家机构/大学/公民监测方案转化为公民科学监测方案
  • 部落机构改为部落机构

他们中的一些会保持原样。我尝试过ifelse语句,但似乎很难确定原始专栏中的内容,并返回NAs进行大量的观察。我检查了我所有的拼写,所以不是这样的。这是我在这里的另一个答案的基础上尝试的。我的数据集的名称是TP_state,其他列的名称是lagoslakeid。但是,它不能正常工作。任何帮助都将不胜感激!

代码语言:javascript
复制
x <- c(TP_state$programtype) 
y <- c(TP_state$lagoslakeid)
df <- data.frame(x,y)
DT <- data.table(df)
DT[, Program_Type := ifelse(x %in% c("Federal Agency", "Federal Agency/University", "National Survey Program"), "Federal Agency/University",
                 ifelse(x %in% c("LTER", "University"), "LTER/University",
                 ifelse(x %in% c("Non-Profit Agency"), "Non-Profit Agency",       
                 ifelse(x %in% c("State Agency"), "State Agency",
                 ifelse(x %in% c("State Agency/University/Citizen Monitoring Program", "State Agency/Citizen Monitoring Program"), "Citizen Monitoring Program", 
                 ifelse(x %in% c("Tribal Agency"), "Tribal Agency", NA))))))]  
EN

回答 2

Stack Overflow用户

发布于 2017-07-13 19:30:50

我会尝试这样的方法。请告诉我它是否对你有用!

代码语言:javascript
复制
for(i in 1:length(df$column_with_factors)){
  if(grepl(pattern = 'federal agency|national survey program', x = df$column[i], ignore.case = TRUE)){
    x <- 'Federal Agency/University'
  } else if(grepl(pattern = '^lter$|^university$', x = df$column[i], ignore.case = TRUE)){
    x <- 'LTER/University'
  } else if(grepl(pattern = 'non-profit agency', x = df$column[i], ignore.case = TRUE)){
    x <- 'Non-profit Agency'
  } else if(grepl(pattern = '^state agency$', x = df$column[i], ignore.case = TRUE)){
    x <- 'State Agency'
  } else if(grepl(pattern = 'state agency/(citizen monitoring program|university/citizen monitoring program)', x = df$column[i], ignore.case = TRUE)){
    x <- 'Citizen Science Monitoring Program'
  } else if(grepl(pattern = 'tribal agency', x = df$column[i], ignore.case = TRUE)){
    x <- 'Tribal Agency'
  } else x <- NA
}

df$column_with_factors <- as.factor(df$column_with_factors)

但这会跑得更快:

代码语言:javascript
复制
df$column_with_factors <- sapply(df$column_with_factors, function(x){
  if(grepl(pattern = 'federal agency|national survey program', x = x, ignore.case = TRUE)){
    x <- 'Federal Agency/University'
  } else if(grepl(pattern = '^lter$|^university$', x = x, ignore.case = TRUE)){
    x <- 'LTER/University'
  } else if(grepl(pattern = 'non-profit agency', x = x, ignore.case = TRUE)){
    x <- 'Non-profit Agency'
  } else if(grepl(pattern = '^state agency$', x = x, ignore.case = TRUE)){
    x <- 'State Agency'
  } else if(grepl(pattern = 'state agency/(citizen monitoring program|university/citizen monitoring program)', x = x, ignore.case = TRUE)){
    x <- 'Citizen Science Monitoring Program'
  } else if(grepl(pattern = 'tribal agency', x = x, ignore.case = TRUE)){
    x <- 'Tribal Agency'
  } else x <- NA
})

df$column_with_factors <- as.factor(df$column_with_factors)
票数 0
EN

Stack Overflow用户

发布于 2017-07-13 20:25:41

forcats包在对这样的任务进行重新编码方面非常出色。

首先创建一些演示数据..。

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

df <-
  tibble(
    programtype = c(
      "Federal Agency",
      "Federal Agency",
      "Federal Agency",
      "State Agency/University/Citizen Monitoring",
      "State Agency/University/Citizen Monitoring Program",
      "Federal Agency/University",
      "National Survey Program",
      "LTER",
      "University",
      "Non-Profit Agency",
      "Non-Profit Agency",
      "Non-Profit Agency",
      "Non-Profit Agency",
      "Non-Profit Agency",
      "State Agency",
      "State Agency",
      "State Agency/Citizen Monitoring Program",
      "State Agency/University/Citizen Monitoring Program",
      "Tribal Agency",
      "Tribal Agency",
      "Tribal Agency"
    ),
    ID = 1:21
  )

然后使用fct_recode替换值..。

代码语言:javascript
复制
df %>%
  mutate(
    new_categories = fct_recode(
      programtype,
      "Federal Agency/University" = "Federal Agency",
      "Federal Agency/University" = "Federal Agency/University",
      "Federal Agency/University" = "National Survey Program",
      "LTER/University" = "LTER",
      "LTER/University" = "University",
      "Citizen Science Monitoring Program" = "State Agency/Citizen Monitoring Program",
      "Citizen Science Monitoring Program" = "State Agency/University/Citizen Monitoring"
    )
  )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45088642

复制
相关文章

相似问题

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