将值 NA 替换为 R 中另一列的值
Replace a value NA with the value from another column in R
我想根据 year 列的年份,将 A 列中 dfABy 中的 NA 值替换为 B 列中的值。比如我的df是:
>dfABy
A B Year
56 75 1921
NA 45 1921
NA 77 1922
67 41 1923
NA 65 1923
我参加的结果是:
> dfABy
A B Year
56 75 1921
*45* 45 1921
*77* 77 1922
67 41 1923
*65* 65 1923
P.S:用 * 值替换每年从 B 列到 A 列的值
简单
library(dplyr)
dfABy %>%
mutate(A_new =
A %>%
is.na %>%
ifelse(B, A) )
您可以使用 [<-
的简单替换,NA
元素的子集。
df$A[is.na(df$A)] <- df$B[is.na(df$A)]
或者,within()
within(df, A[is.na(A)] <- B[is.na(A)])
都给
A B Year
1 56 75 1921
2 45 45 1921
3 77 77 1922
4 67 41 1923
5 65 65 1923
数据:
df <- structure(list(A = c(56L, NA, NA, 67L, NA), B = c(75L, 45L, 77L,
41L, 65L), Year = c(1921L, 1921L, 1922L, 1923L, 1923L)), .Names = c("A",
"B", "Year"), class = "data.frame", row.names = c(NA, -5L))
也许 read/understand 在 R 词典中最简单的答案是使用 ifelse。所以借用 Richard 的数据框我们可以这样做:
df <- structure(list(A = c(56L, NA, NA, 67L, NA),
B = c(75L, 45L, 77L, 41L, 65L),
Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),.Names = c("A",
"B", "Year"), class = "data.frame", row.names = c(NA, -5L))
df$A <- ifelse(is.na(df$A), df$B, df$A)
现在根据@Max 进行了更正。 (原件与初始实施一起使用)
新的 dplyr 函数 coalesce
可以真正简化这些情况。
library(dplyr)
dfABy %>%
mutate(A = coalesce(A,B))
GGAnderson提供的解决方案return报错了。但是在 mutate() 中使用它效果很好。
df <- structure(list(A = c(56L, NA, NA, 67L, NA),
B = c(75L, 45L, 77L, 41L, 65L),
Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),
.Names = c("A", "B", "Year"),
class = "data.frame",
row.names = c(NA, -5L))
df
df%>%
coalesce(A,B) #returns error
df %>%
mutate(A = coalesce(A,B)) #works
(我是 Whosebug 的新手;我的低声誉不允许直接评论 GGAnderson 的回答)
我想根据 year 列的年份,将 A 列中 dfABy 中的 NA 值替换为 B 列中的值。比如我的df是:
>dfABy
A B Year
56 75 1921
NA 45 1921
NA 77 1922
67 41 1923
NA 65 1923
我参加的结果是:
> dfABy
A B Year
56 75 1921
*45* 45 1921
*77* 77 1922
67 41 1923
*65* 65 1923
P.S:用 * 值替换每年从 B 列到 A 列的值
简单
library(dplyr)
dfABy %>%
mutate(A_new =
A %>%
is.na %>%
ifelse(B, A) )
您可以使用 [<-
的简单替换,NA
元素的子集。
df$A[is.na(df$A)] <- df$B[is.na(df$A)]
或者,within()
within(df, A[is.na(A)] <- B[is.na(A)])
都给
A B Year
1 56 75 1921
2 45 45 1921
3 77 77 1922
4 67 41 1923
5 65 65 1923
数据:
df <- structure(list(A = c(56L, NA, NA, 67L, NA), B = c(75L, 45L, 77L,
41L, 65L), Year = c(1921L, 1921L, 1922L, 1923L, 1923L)), .Names = c("A",
"B", "Year"), class = "data.frame", row.names = c(NA, -5L))
也许 read/understand 在 R 词典中最简单的答案是使用 ifelse。所以借用 Richard 的数据框我们可以这样做:
df <- structure(list(A = c(56L, NA, NA, 67L, NA),
B = c(75L, 45L, 77L, 41L, 65L),
Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),.Names = c("A",
"B", "Year"), class = "data.frame", row.names = c(NA, -5L))
df$A <- ifelse(is.na(df$A), df$B, df$A)
现在根据@Max 进行了更正。 (原件与初始实施一起使用)
新的 dplyr 函数 coalesce
可以真正简化这些情况。
library(dplyr)
dfABy %>%
mutate(A = coalesce(A,B))
GGAnderson提供的解决方案return报错了。但是在 mutate() 中使用它效果很好。
df <- structure(list(A = c(56L, NA, NA, 67L, NA),
B = c(75L, 45L, 77L, 41L, 65L),
Year = c(1921L, 1921L, 1922L, 1923L, 1923L)),
.Names = c("A", "B", "Year"),
class = "data.frame",
row.names = c(NA, -5L))
df
df%>%
coalesce(A,B) #returns error
df %>%
mutate(A = coalesce(A,B)) #works
(我是 Whosebug 的新手;我的低声誉不允许直接评论 GGAnderson 的回答)