【问题标题】:Overwrite a value on a data.frame filtered with Dplyr - R覆盖使用 Dplyr - R 过滤的 data.frame 上的值
【发布时间】: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))

标签: r dplyr


【解决方案1】:

如果您想用固定值更新行,@akrun 的replace 解决方案将起作用。一般来说,你必须使用ifelse函数,我相信:

cleantrain <- cleantrain %>% 
  mutate(age = ifelse(Title == 'Master' & is.na(age),
                      8,
                      age))

【讨论】:

    猜你喜欢
    • 2020-08-08
    • 2016-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2017-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多