我有一个data
如下:
data<-data.frame(id=c(1,2,3,4,5,6,7,8,9,10),
Wt=c(91,92,85,205,285,43,95,75,76,NA),
Ht=c(185,182,173,171,600,650,NA,890,NA,NA))
字符串Wt
代表体重(千克),Ht
代表身高(厘米)。在这个例子中,我想把大于200的Wt
的值作为离群值,并更改为一些特定的数字。另外,我想将大于250的Ht
的值视为离群值,并更改为NA
。在我的实际data
中,Wt
中的异常值很少,而Ht
中的异常值很多。所以,我可以通过使用下面的代码找到Wt
的异常值:
a1<-data$Wt
a1<-data.frame(a1)
a1<-na.omit(a1)
b1<-a1[a1$a1>200, ]
b1 #205,285
型
我想把205改成80,把285改成90。(因为在我的实际数据中,Wt
的异常值很少,所以我可以单独更改它们。)此外,我想让Ht
的值大于250,作为NA
。所以我的预期输出如下:
data<-data.frame(id=c(1,2,3,4,5,6,7,8,9,10),
Wt=c(91,92,85,80,90,43,95,75,76,NA),
Ht=c(185,182,173,171,NA,NA,NA,NA,NA,NA))
型
2条答案
按热度按时间zbq4xfa01#
data.table
:字符串
有关详细信息,请参阅:Introduction to
data.table
的数据。要在
data.table
中实现Shawn建议的ifelse
方法,可以执行以下操作。这仍然是通过引用更新的,所以仍然不需要编写类似data <- data %>% ...
的东西。型
请注意,
fifelse
是data.table
的 fastifelse
,我使用fcase
一起处理两个Wt
条件(尽管rep(TRUE, .N)
trick有点笨拙,所以也许对Wt
使用两个fifelse
调用而不是fcase
会更好)。更新2023-07-17:如果你需要一个矢量化的选项,我建议你使用
plyr::mapvalues
。即使plyr
已经退役,您也可以使用body(plyr::mapvalues)
并将代码放入您自己的项目中。ukxgm1gy2#
上面的答案很有用。我还想添加一个替代答案,以防您发现它对学习其他函数有帮助。您可以使用
ifelse
和tidyverse
的功能插入任何想要的值。例如,我在这里使用mutate
创建变量,使用ifelse
简单地转换您想要的值。下面基本上只是你的数据和两个函数组合成一个命令:字符串
下面是我对代码所做的注解:
型
它应该根据您的使用方式给予任何所需的输出:
型
试试看,让我知道你的想法!