我尝试使用索引和匹配调整数据点并将其应用于 R 中数据集中的指定组
I tried to adjust datapoint using index and match and applied it to specified group in dataset in R
我有一个记录鸡感染状态的数据集。鸡群中的第一列是I和S,其余列是每个采样时间的状态(0,1)。我需要调整 I 组中的信息,我想用 0.5 替换第一个 1 之前的最后一个 0。
我使用索引和匹配在向量上进行了尝试
v= c(0,0,1,0,1,1,1)
v[[match(1,v) -1]] = 0.5
但我正在努力将其应用于数据集
我在这里写了一个简化版本的数据框
dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
"T1" = c(0,0, 0, 0, 0, 0),
"T2" = c(0,0, 0, 0, 0, 0),
"T3"= c(0,0, 1, 0, 1, 1),
"T4"= c(1,1,1, 1, 1, 1))**
所需的输出应如下所示
dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
"T1" = c(0,0, 0, 0, 0, 0),
"T2" = c(0,0, 0, 0, 0, 0.5),
"T3"= c(0.5,0.5, 1, 0, 1, 1),
"T4"= c(1,1,1, 1, 1, 1))
我试过使用 mutate 和 innerjoin,但似乎不起作用。请帮忙
这是一种方法。您可以添加行号以独立地考虑每一行。使用 pivot_longer
,您可以将数据放入长格式,然后为 Role
为“I”的数据寻找随时间从 0 到 1 的转换(从 T1 到 T4)。数据可以以这种方式保留以供进一步操作或分析,或转换回宽格式,如下所示。请注意,此解决方案考虑了从一种状态到另一种状态的转换(感染状态 0 到 1)——不一定要查看这是否涉及给定 Role
.
的“第一个”状态 1
library(tidyverse)
dftry %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -c(Role, rn)) %>%
group_by(rn) %>%
mutate(value = ifelse(
Role == "I" & value == 0 & lead(value) == 1, .5, value
)) %>%
pivot_wider(id_cols = c(Role, rn))
输出
Role rn T1 T2 T3 T4
<chr> <int> <dbl> <dbl> <dbl> <dbl>
1 I 1 0 0 0.5 1
2 I 2 0 0 0.5 1
3 S 3 0 0 1 1
4 S 4 0 0 0 1
5 S 5 0 0 1 1
6 I 6 0 0.5 1 1
我有一个记录鸡感染状态的数据集。鸡群中的第一列是I和S,其余列是每个采样时间的状态(0,1)。我需要调整 I 组中的信息,我想用 0.5 替换第一个 1 之前的最后一个 0。 我使用索引和匹配在向量上进行了尝试
v= c(0,0,1,0,1,1,1)
v[[match(1,v) -1]] = 0.5
但我正在努力将其应用于数据集 我在这里写了一个简化版本的数据框
dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
"T1" = c(0,0, 0, 0, 0, 0),
"T2" = c(0,0, 0, 0, 0, 0),
"T3"= c(0,0, 1, 0, 1, 1),
"T4"= c(1,1,1, 1, 1, 1))**
所需的输出应如下所示
dftry <- data.frame("Role" = c("I", "I", "S", "S", "S", "I"),
"T1" = c(0,0, 0, 0, 0, 0),
"T2" = c(0,0, 0, 0, 0, 0.5),
"T3"= c(0.5,0.5, 1, 0, 1, 1),
"T4"= c(1,1,1, 1, 1, 1))
我试过使用 mutate 和 innerjoin,但似乎不起作用。请帮忙
这是一种方法。您可以添加行号以独立地考虑每一行。使用 pivot_longer
,您可以将数据放入长格式,然后为 Role
为“I”的数据寻找随时间从 0 到 1 的转换(从 T1 到 T4)。数据可以以这种方式保留以供进一步操作或分析,或转换回宽格式,如下所示。请注意,此解决方案考虑了从一种状态到另一种状态的转换(感染状态 0 到 1)——不一定要查看这是否涉及给定 Role
.
library(tidyverse)
dftry %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -c(Role, rn)) %>%
group_by(rn) %>%
mutate(value = ifelse(
Role == "I" & value == 0 & lead(value) == 1, .5, value
)) %>%
pivot_wider(id_cols = c(Role, rn))
输出
Role rn T1 T2 T3 T4
<chr> <int> <dbl> <dbl> <dbl> <dbl>
1 I 1 0 0 0.5 1
2 I 2 0 0 0.5 1
3 S 3 0 0 1 1
4 S 4 0 0 0 1
5 S 5 0 0 1 1
6 I 6 0 0.5 1 1