覆盖使用 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 中找到要替换为 filterselect 函数的值。

> 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 上的值的主要内容,如果未能解决你的问题,请参考以下文章

R行数据过滤基于dplyr包filter函数

r 使用R中的dplyr过滤包含特定字符串的行

Python 相当于 R 的 grepl 和 dplyr 过滤器 [重复]

在R中,如何使用dplyr按数据类型过滤数据帧?

R语言dplyr包filter函数通过逻辑条件过滤数据实战

使用dplyr在R中的所有列上应用iqr过滤器