覆盖使用 Dplyr - R 过滤的 data.frame 上的值
Posted
技术标签:
【中文标题】覆盖使用 Dplyr - R 过滤的 data.frame 上的值【英文标题】:Overwrite a value on a data.frame filtered with Dplyr - R 【发布时间】:2020-12-01 15:07:41 【问题描述】:我有一个名为cleandata
的数据框,需要更改age
列的值。
我可以从 dplyr 中找到要替换为 filter
和 select
函数的值。
> str(cleantrain)
'data.frame': 891 obs. of 9 variables:
$ train$PassengerId: int 1 2 3 4 5 6 7 8 9 10 ...
$ survived : Factor w/ 2 levels "0","1": 1 2 2 2 1 1 1 1 2 2 ...
$ Title : Factor w/ 17 levels "Capt","Col","Don",..: 12 13 9 13 12 12 12 8 13 13 ...
$ fare : num 7.25 71.28 7.92 53.1 8.05 ...
$ sbsp : int 1 1 0 1 0 0 0 3 0 1 ...
$ parch : int 0 0 0 0 0 0 0 1 2 0 ...
$ alone : Factor w/ 2 levels "0","1": 1 1 2 1 2 2 2 1 1 1 ...
$ familysize : Factor w/ 9 levels "1","2","3","4",..: 2 2 1 2 1 1 1 5 3 2 ...
$ age : num 22 38 26 35 35 NA 54 2 27 14 ...
# Column title is equal to "Master" and Column age is NA
> cleantrain %>% filter(Title == "Master" & is.na(age))
train$PassengerId survived Title fare sbsp parch alone familysize age
1 66 1 Master 15.2458 1 1 0 3 NA
2 160 0 Master 69.5500 8 2 0 11 NA
3 177 0 Master 25.4667 3 1 0 5 NA
4 710 1 Master 15.2458 1 1 0 3 NA
我只需要将这些 NA 替换为 8。
如下使用 mutate 不会更新原始 cleantrain
data.frame
>cleantrain %>% filter(Title == "Master" & is.na(age)) %>% mutate(age = 8) #will put the right info on the right place.
train$PassengerId survived Title fare sbsp parch alone familysize age
1 66 1 Master 15.2458 1 1 0 3 8
2 160 0 Master 69.5500 8 2 0 11 8
3 177 0 Master 25.4667 3 1 0 5 8
4 710 1 Master 15.2458 1 1 0 3 8
#but not actually. when checking dataframe values remains NAS
>cleantrain %>% filter(Title == "Master" & is.na(age))
train$PassengerId survived Title fare sbsp parch alone familysize age
1 66 1 Master 15.2458 1 1 0 3 NA
2 160 0 Master 69.5500 8 2 0 11 NA
3 177 0 Master 25.4667 3 1 0 5 NA
4 710 1 Master 15.2458 1 1 0 3 NA
我可以使用 mutate 来执行此操作吗?任何不需要 for/if 循环的 Dplyr/quick 函数? #learningR
【问题讨论】:
您没有更新原始的 'cleantrain;另外,不要使用filter
,而是尝试replace
,即cleantrain <- cleantrain %>% mutate(age = replace(age, Title == 'Master' & is.na(age), 8))
【参考方案1】:
如果您想用固定值更新行,@akrun 的replace
解决方案将起作用。一般来说,你必须使用ifelse
函数,我相信:
cleantrain <- cleantrain %>%
mutate(age = ifelse(Title == 'Master' & is.na(age),
8,
age))
【讨论】:
以上是关于覆盖使用 Dplyr - R 过滤的 data.frame 上的值的主要内容,如果未能解决你的问题,请参考以下文章