假设我有一个很大的数据帧,现在我想根据一列更新另一列
我以前确实问过类似的问题,但在这里我重新改变了格式,并将所有情况合并到一个数据帧中,我认为解决它是值得的。
我想更新基于name2的列name3,并保留另外两个列。我的例子如下
df <- data.frame(ID = c("BF1","BF3", "BF4", "BF3","BF3","BF1", "BF1", "BF1", "BF2", "BF2", "BF3"),
value = c(1,2,3,4,5,6,7,8,9,10,11),
name2 = c("Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus", "Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus",
"Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus", "Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus",
"Senegalia rugata (Lam.) Britton & Rose", "Acacia pinnata", "Acacia pinnata", "Acer laurinum", "Acer laurinum Hassk.", "Acmella paniculata", "Acmella paniculata"),
name3 = c("Hydnocarpus sumatrana", "Hydnocarpus sumatrana", "Hydnocarpus sumatrana", "Hydnocarpus sumatranus (Miq.) Koord.","Acacia pinnata", "Acacia pinnata",
"Acacia pinnata", "Acer laurinum", "Acer laurinum Hassk.", "Acmella paniculata", "Acmella paniculata"))
df
ID value name2 name3
1 BF1 1 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
2 BF3 2 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
3 BF4 3 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
4 BF3 4 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord.
5 BF3 5 Senegalia rugata (Lam.) Britton & Rose Acacia pinnata
6 BF1 6 Acacia pinnata Acacia pinnata
7 BF1 7 Acacia pinnata Acacia pinnata
8 BF1 8 Acer laurinum Acer laurinum
9 BF2 9 Acer laurinum Hassk. Acer laurinum Hassk.
10 BF2 10 Acmella paniculata Acmella paniculata
11 BF3 11 Acmella paniculata Acmella paniculata首先,我想通过Senegalia rugata (Lam.) Britton & Rose更新Acacia pinnata,条件是name2的字符与name3匹配(即Acacia pinnata),同时,name3的字符与name2的另一个字符在同一行(即Senegalia rugata (Lam.) Britton & Rose - name2和Acacia pinnata - name3 )。
其次,我想用Acer laurinum Hassk.替换Acer laurinum,如果两个它们的第一个字符串相似,就去取更长的那个。如果我们与str_detect一起使用,这是可能的吗
最后,我想要的表如下所示
ID value name2 name3
1 BF1 1 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus
2 BF3 2 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus
3 BF4 3 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus
4 BF3 4 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus
5 BF3 5 Senegalia rugata (Lam.) Britton & Rose Senegalia rugata (Lam.) Britton & Rose
6 BF1 6 Acacia pinnata Senegalia rugata (Lam.) Britton & Rose
7 BF1 7 Acacia pinnata Senegalia rugata (Lam.) Britton & Rose
8 BF1 8 Acer laurinum Acer laurinum Hassk.
9 BF2 9 Acer laurinum Hassk. Acer laurinum Hassk.
10 BF2 10 Acmella paniculata Acmella paniculata
11 BF3 11 Acmella paniculata Acmella paniculata对我有什么建议吗?
发布于 2021-10-12 06:26:31
这是你想要的吗?如果没有,请让我知道。
df %>%
rowwise %>%
mutate(name3 = case_when(
name3 == 'Acacia pinnata' & name2 %in% c("Senegalia rugata (Lam.) Britton & Rose", "Acacia pinnata") ~ "Senegalia rugata (Lam.) Britton & Rose",
str_detect(name3, "Acer laurinum") ~ "Acer laurinum Hassk.",
TRUE ~ name3
))
ID value name2 name3
<chr> <dbl> <chr> <chr>
1 BF1 1 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
2 BF3 2 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
3 BF4 3 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatrana
4 BF3 4 Hydnocarpus sumatranus (Miq.) Koord. var. sumatranus Hydnocarpus sumatranus (Miq.) Koord.
5 BF3 5 Senegalia rugata (Lam.) Britton & Rose Senegalia rugata (Lam.) Britton & Rose
6 BF1 6 Acacia pinnata Senegalia rugata (Lam.) Britton & Rose
7 BF1 7 Acacia pinnata Senegalia rugata (Lam.) Britton & Rose
8 BF1 8 Acer laurinum Acer laurinum Hassk.
9 BF2 9 Acer laurinum Hassk. Acer laurinum Hassk.
10 BF2 10 Acmella paniculata Acmella paniculata
11 BF3 11 Acmella paniculata Acmella paniculata https://stackoverflow.com/questions/69535124
复制相似问题