"tidyr like" 从不同的列填写 na
"tidyr like" fill na from different column
我有一个缺失值的数据框是某列(谁没有)。
例如:
df <- data.frame(x = c(2,NA,4), y = 5:7)
df
x y
1 2 5
2 NA 6
3 4 7
我想用不同列的值替换缺失值。显然有很多方法可以做到,例如:
df %>%
mutate(x = ifelse(is.na(x), y, x))
x y
1 2 5
2 6 6
3 4 7
不过,我正在寻找更优雅的东西,比如
df %>% fill(x,y)
但找不到任何东西。这样的东西存在吗?
谢谢!
我知道我没有完全回答这个问题,但我发现标准数据框的方式还不错:
df$x[is.na(df$x)] <- df$y[is.na(df$x)]
和data.table方式非常简单和优雅:
df[is.na(x),x := y]
试试这个,祝你好运
df <- t(apply(df, 1, function(x) if(any(is.na(x))) rep(x[!is.na(x)], 2) else x))
as.data.frame(df)
您想更改单个列中的值,同时保持相同的行数。 tidyverse 的方法是 dplyr::mutate
,你想要的特定操作的 tidyverse 实现是 dplyr::coalesce
,正如 docendo discimus 所建议的:
df %>% mutate(x = coalesce(x, y))
如果只有一个函数将这两个步骤结合起来,事情就会不那么整洁和不一致,因为它不是对整个数据帧进行操作,只是一个单一的柱子。它也不太灵活,因为 coalesce
可以用于向量,无论它们是否在数据框中,这很好!
(我实际上不喜欢 tidyr::fill
- 我认为它是一致的,因为它对数据框的所有列进行操作,但我更喜欢它采用单个向量并且通常在 mutate
。mutate_all(fill)
很容易完成整个数据框。所以我最终仍然依赖 zoo::na.locf
进行一般使用。)
我有一个缺失值的数据框是某列(谁没有)。 例如:
df <- data.frame(x = c(2,NA,4), y = 5:7)
df
x y
1 2 5
2 NA 6
3 4 7
我想用不同列的值替换缺失值。显然有很多方法可以做到,例如:
df %>%
mutate(x = ifelse(is.na(x), y, x))
x y
1 2 5
2 6 6
3 4 7
不过,我正在寻找更优雅的东西,比如
df %>% fill(x,y)
但找不到任何东西。这样的东西存在吗?
谢谢!
我知道我没有完全回答这个问题,但我发现标准数据框的方式还不错:
df$x[is.na(df$x)] <- df$y[is.na(df$x)]
和data.table方式非常简单和优雅:
df[is.na(x),x := y]
试试这个,祝你好运
df <- t(apply(df, 1, function(x) if(any(is.na(x))) rep(x[!is.na(x)], 2) else x))
as.data.frame(df)
您想更改单个列中的值,同时保持相同的行数。 tidyverse 的方法是 dplyr::mutate
,你想要的特定操作的 tidyverse 实现是 dplyr::coalesce
,正如 docendo discimus 所建议的:
df %>% mutate(x = coalesce(x, y))
如果只有一个函数将这两个步骤结合起来,事情就会不那么整洁和不一致,因为它不是对整个数据帧进行操作,只是一个单一的柱子。它也不太灵活,因为 coalesce
可以用于向量,无论它们是否在数据框中,这很好!
(我实际上不喜欢 tidyr::fill
- 我认为它是一致的,因为它对数据框的所有列进行操作,但我更喜欢它采用单个向量并且通常在 mutate
。mutate_all(fill)
很容易完成整个数据框。所以我最终仍然依赖 zoo::na.locf
进行一般使用。)