根据 R 中的条件分配新值
Assigning new value based on a condition in R
我有这样的数据框:
df<- data.frame(
"Col1" = c("P1", "P1", "P1", "P2", "P2", "P2", "P3", "P3", "P3",
"P3"),
"Col2" = c("L", "L&R", "R", "V", "V&N", "N", "M", "I", "I&M",
"I&M&G"),
"Value" = c("20", "5", "75", "30", "7", "63", "10", "80", "2","8"))
df
我想要的是根据第二列重新定义值。我的意思是,当我在第二列中有 L&R 时,我想将其值除以 2(从第三列开始,在本例中为 5)并将此结果添加到同一 P1 组中的 L 和 R。所以,L&R=5/2 将是 2.5。这个2.5应该加上P1组的L为22.5,加上P1组的R为77.5。但是如果我在第 2 列中有两个 &&
,我不知道它是什么,所以我希望忽略所有 &&
或更多的东西。最终输出应如下所示:
df.output<- data.frame(
"Col1" = c("P1", "P1", "P2", "P2", "P3", "P3"),
"Col2" = c("L", "R", "V", "N", "M", "I" ),
"Value" = c("22.5", "77.5", "33.5", "66.5", "11", "81"))
df.output
> df.output
Col1 Col2 Value
1 P1 L 22.5
2 P1 R 77.5
3 P2 V 33.5
4 P2 N 66.5
5 P3 M 11
6 P3 I 81
你能帮帮我吗?
非常感谢。
试试这个解决方案:
library(dplyr)
library(stringr)
library(tidyr)
df %>%
filter(!str_count(Col2, "&") > 1) %>%
mutate(Value = ifelse(grepl("&", Col2), as.numeric(Value) / 2, as.numeric(Value))) %>%
separate_rows(Col2, sep = "&") %>%
group_by(Col1, Col2) %>%
summarise(Value = sum(Value)) %>%
ungroup()
# A tibble: 6 x 3
Col1 Col2 Value
<chr> <chr> <dbl>
1 P1 L 22.5
2 P1 R 77.5
3 P2 N 66.5
4 P2 V 33.5
5 P3 I 42
6 P3 M 50
我有这样的数据框:
df<- data.frame(
"Col1" = c("P1", "P1", "P1", "P2", "P2", "P2", "P3", "P3", "P3",
"P3"),
"Col2" = c("L", "L&R", "R", "V", "V&N", "N", "M", "I", "I&M",
"I&M&G"),
"Value" = c("20", "5", "75", "30", "7", "63", "10", "80", "2","8"))
df
我想要的是根据第二列重新定义值。我的意思是,当我在第二列中有 L&R 时,我想将其值除以 2(从第三列开始,在本例中为 5)并将此结果添加到同一 P1 组中的 L 和 R。所以,L&R=5/2 将是 2.5。这个2.5应该加上P1组的L为22.5,加上P1组的R为77.5。但是如果我在第 2 列中有两个 &&
,我不知道它是什么,所以我希望忽略所有 &&
或更多的东西。最终输出应如下所示:
df.output<- data.frame(
"Col1" = c("P1", "P1", "P2", "P2", "P3", "P3"),
"Col2" = c("L", "R", "V", "N", "M", "I" ),
"Value" = c("22.5", "77.5", "33.5", "66.5", "11", "81"))
df.output
> df.output
Col1 Col2 Value
1 P1 L 22.5
2 P1 R 77.5
3 P2 V 33.5
4 P2 N 66.5
5 P3 M 11
6 P3 I 81
你能帮帮我吗? 非常感谢。
试试这个解决方案:
library(dplyr)
library(stringr)
library(tidyr)
df %>%
filter(!str_count(Col2, "&") > 1) %>%
mutate(Value = ifelse(grepl("&", Col2), as.numeric(Value) / 2, as.numeric(Value))) %>%
separate_rows(Col2, sep = "&") %>%
group_by(Col1, Col2) %>%
summarise(Value = sum(Value)) %>%
ungroup()
# A tibble: 6 x 3
Col1 Col2 Value
<chr> <chr> <dbl>
1 P1 L 22.5
2 P1 R 77.5
3 P2 N 66.5
4 P2 V 33.5
5 P3 I 42
6 P3 M 50