R未根据条件更新字段

时间:2017-11-21 11:15:00

标签: r

我有一个简单的DF:

Dev_Func   
agn   
agn   
ttt   
ttt   
agn

我想要做的就是该字段包含" agn"将其替换为" PE"

这是我写的代码:

test = subset(Final.ds,Device_Function == "AGN" | Device_Function ==   
"TTT", select = c(Device_Function))
colnames(test) = c("Device_Function")
as.character(test)
test = within(test, Device_Function[Device_Function == 'AGN'] = 'PE')

但我只是继续发现这个错误:

Warning message:
In `[<-.factor`(`*tmp*`, Device_Function == "AGN", value = "PE") :
invalid factor level, NA generated

它所做的就是取代所有&#34; AGN&#34; NA的值。 请帮助!

2 个答案:

答案 0 :(得分:3)

您可以使用gsub执行此操作:

df$Dev_Func <- gsub("agn", "PE", df$Dev_Func)

df

#  Dev_Func
#1       PE
#2       PE
#3      ttt
#4      ttt
#5       PE

保持Dev_Func作为因素的替代解决方案(如akrun所述):

df$Dev_Func <- as.factor(gsub("agn", "PE", df$Dev_Func))

class(df$Dev_Func)

[1] "factor"

答案 1 :(得分:2)

由于该列是factor,我们可以指定“{1}}”。到了&#39; PE&#39;

levels

并将其保留为levels(DF$Dev_Func)[levels(DF$Dev_Func)=='agn'] <- 'PE'

factor

注意:假设&#39; agn&#39;是固定匹配而不是子字符串

在OP代码中,即levels(DF$Dev_Func) #[1] "PE" "ttt" DF # Dev_Func #1 PE #2 PE #3 ttt #4 ttt #5 PE 功能,存在一些问题

1)作业是within而不是<-

2)它无法进行逻辑子集分配

3)该列为=,并且没有任何级别的&#39; PE&#39;它会生成有关factor

的警告消息

4)根据例子,&#39; agn&#39;是小写而不是AGN&#39; (可能是拼写错误),但invalid factor level, NA generated区分大小写

假设我们将R添加为PE

levels

然后下面的作业将起作用

 DF$Dev_Func <- factor(DF$Dev_Func, levels = c(levels(DF$Dev_Func), 'PE'))

与基于 DF$Dev_Func[DF$Dev_Func=='agn'] <- 'PE' 作业

的更改相比,它仍然不是一种更干净的方式

数据

levels