用 R 组中的非 NA 字符替换一组值的 NA
Replace NAs for a group of values with a non-NA character in group in R
如果这个非 NA 字符并不总是出现在同一个位置(第一行或其他),我正在尝试找到一种方法来按组用非 NA 字符替换一组值的 NA .我发现的解决方案不适用于字符或仅根据先前或后续值进行填充。
这是一个数据示例:
participant_id <- c("ps1", "ps1", "ps1", "ps1", "ps2", "ps2", "ps3", "ps3", "ps3", "ps3")
test <- c("test1", NA, NA, NA, NA, "test2", NA, NA, "test3", NA)
data.frame(participant_id, test)
这就是我想要的结局:
participant_id
test
ps1
test1
ps1
test1
ps1
test1
ps1
test1
ps2
test2
ps2
test2
ps3
test3
ps3
test3
ps3
test3
ps3
test3
按'participant_id'
分组后,我们可以使用tidyr
中的fill
library(dplyr)
library(tidyr)
df1 <- df1 %>%
group_by(participant_id) %>%
fill(test, .direction = "downup") %>%
ungroup
-输出
df1
# A tibble: 10 × 2
participant_id test
<chr> <chr>
1 ps1 test1
2 ps1 test1
3 ps1 test1
4 ps1 test1
5 ps2 test2
6 ps2 test2
7 ps3 test3
8 ps3 test3
9 ps3 test3
10 ps3 test3
数据
df1 <- data.frame(participant_id, test)
这是使用 zoo
包中的 na.locf
的替代方法:
library(zoo)
library(dplyr)
df %>%
group_by(participant_id) %>%
arrange(participant_id, test) %>%
mutate(test = zoo::na.locf(test, na.rm=FALSE))
participant_id test
<chr> <chr>
1 ps1 test1
2 ps1 test1
3 ps1 test1
4 ps1 test1
5 ps2 test2
6 ps2 test2
7 ps3 test3
8 ps3 test3
9 ps3 test3
10 ps3 test3
如果这个非 NA 字符并不总是出现在同一个位置(第一行或其他),我正在尝试找到一种方法来按组用非 NA 字符替换一组值的 NA .我发现的解决方案不适用于字符或仅根据先前或后续值进行填充。
这是一个数据示例:
participant_id <- c("ps1", "ps1", "ps1", "ps1", "ps2", "ps2", "ps3", "ps3", "ps3", "ps3")
test <- c("test1", NA, NA, NA, NA, "test2", NA, NA, "test3", NA)
data.frame(participant_id, test)
这就是我想要的结局:
participant_id | test |
---|---|
ps1 | test1 |
ps1 | test1 |
ps1 | test1 |
ps1 | test1 |
ps2 | test2 |
ps2 | test2 |
ps3 | test3 |
ps3 | test3 |
ps3 | test3 |
ps3 | test3 |
按'participant_id'
分组后,我们可以使用tidyr
中的fill
library(dplyr)
library(tidyr)
df1 <- df1 %>%
group_by(participant_id) %>%
fill(test, .direction = "downup") %>%
ungroup
-输出
df1
# A tibble: 10 × 2
participant_id test
<chr> <chr>
1 ps1 test1
2 ps1 test1
3 ps1 test1
4 ps1 test1
5 ps2 test2
6 ps2 test2
7 ps3 test3
8 ps3 test3
9 ps3 test3
10 ps3 test3
数据
df1 <- data.frame(participant_id, test)
这是使用 zoo
包中的 na.locf
的替代方法:
library(zoo)
library(dplyr)
df %>%
group_by(participant_id) %>%
arrange(participant_id, test) %>%
mutate(test = zoo::na.locf(test, na.rm=FALSE))
participant_id test
<chr> <chr>
1 ps1 test1
2 ps1 test1
3 ps1 test1
4 ps1 test1
5 ps2 test2
6 ps2 test2
7 ps3 test3
8 ps3 test3
9 ps3 test3
10 ps3 test3