R 需要一种有效的方法将因子值从数据帧的一列更改为另一列

R 需要一种有效的方法将因子值从数据帧的一列更改为另一列,r,dataframe,data-cleaning,R,Dataframe,Data Cleaning,我目前正在处理data.frame中的分类数据,其中两列是类型因子。它总共有大约9000行,超过40个级别。目前,我首先将这些列更改为字符,因为当我尝试使用因子形式更改它们时,我得到了NA值。在我将这些列更改为字符后,我能够更改它们,然后我将列的类型更改回“因子” 这是我的方法代码: 库(dplyr) #模型数据帧 df我们可以使用fct\u collapse,它返回一个带有新级别的因子 library(dplyr) library(forcats) library(magrittr) df %

我目前正在处理
data.frame
中的分类数据,其中两列是类型因子。它总共有大约9000行,超过40个级别。目前,我首先将这些列更改为字符,因为当我尝试使用因子形式更改它们时,我得到了
NA
值。在我将这些列更改为字符后,我能够更改它们,然后我将列的类型更改回“因子”

这是我的方法代码:

库(dplyr)
#模型数据帧

df我们可以使用
fct\u collapse
,它返回一个带有新
级别的
因子

library(dplyr)
library(forcats)
library(magrittr)
df %<>%
    mutate(B = fct_collapse(B, CHANGED = as.character(B)[A== "Kelly"]))

glimpse(df)
#Rows: 7
#Columns: 2
#$ A <fct> Jerry, Kelly, Kelly, Lion, Zebra, Bear, Kelly
#$ B <fct> Eats, CHANGED, CHANGED, Roars, Runs, Sleeps, CHANGED
库(dplyr)
图书馆(供猫用)
图书馆(magrittr)
df%%
变异(B=fct_collapse(B,CHANGED=as.character(B)[A==“Kelly”]))
一瞥(df)
#行数:7
#栏目:2
#$A杰瑞,凯利,凯利,狮子,斑马,熊,凯利
#$B吃、换、换、吼、跑、睡、换

这不也行吗

df%
变异(B=ifelse(A='Kelly','CHANGED','B))

如果您希望在不将列转换为字符的情况下执行此操作。一种方法是添加数据中不存在的因子级别(
“CHANGED”
),然后直接赋值

levels(df$B) <- c(levels(df$B), "CHANGED")
df$B[df$A == "Kelly"] <- "CHANGED"
df

#      A       B
#1 Jerry    Eats
#2 Kelly CHANGED
#3 Kelly CHANGED
#4  Lion   Roars
#5 Zebra    Runs
#6  Bear  Sleeps
#7 Kelly CHANGED

levels(df$B)作为alt,为什么不将它们作为字符读入,然后更新它们,这样您只需将它们设置为factor onceThank,就可以得到回复了。我正在处理其他人的脚本文件。所以我不知道我是否应该去那里改变他的密码。我的任务是分类,以及完成数据加载和清理的部分;但是您可以将
stringsAsFactors=FALSE
添加到数据加载端口。您肯定是正确的。让我再深入研究一下他的代码,我不想在我这么做之后把事情搞砸。你知道,我告诉a**就这么做,但他不听。@ToadPitt将%
中的
=
更改为
%,因为
=
用于元素比较。如果
==
右侧的向量长度不同,则会循环使用(长度为1就可以了,但如果长度大于1,则第一行与Jerry进行比较,第二行与Kelly进行比较,第三行与Jerry进行比较,等等。在%
中使用
%Gotcha boss。非常感谢Akrun!非常感谢。@ToadPitt。我无法复制
df@ToadPitt进行比较,我将其分配给另一个对象
kd1%mutate(B=fct\u)(B,更改为as.character(B)[A==“水管泄漏/溢出”]);级别(kd1$B)#[1]“公共服务”“更改”“健康和公共安全”“交通”
@ToadPitt,如果您选中
as.character(kd$B[kd$A==“水管泄漏/溢出”])[1]“社区”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”[15]“邻里”“邻里”“邻里”“邻里”“邻里”“邻里”“
无论邻里在哪里,它都会被更改为“已更改”。它也可以在其他行中,即
sum(kd$B==“邻里”,na.rm=TRUE)[1]4315
Hi Adam,这也行。不过,我选择Akrun的回答作为答案,因为他是第一个。非常感谢您的帮助,非常感谢。不用担心!如果您想更改因素,Akrun的回答可能会更好。
df <- data.frame(A= as.factor(c("Jerry", "Kelly","Kelly", "Lion", "Zebra", 
                    "Bear", "Kelly")), 
                 B= as.factor(c("Eats", "Jumps", "Roasts", "Roars", "Runs",
                    "Sleeps", "Jumps")))