我有一個資料集,它有兩個變數,一個字符和一個數字:
structure(list(ID = c("A", "B", "C", "D", "E", "A", "B", "C",
"D", "E", "A", "B", "C", "D", "E", "A", "B", "C", "D", "E"),
value = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20)), class = "data.frame", row.names = c(NA,
-20L))
我想做的是為“A”和“E”的每個序列在每組“A”和“E”之間切換“值”變數的值。
因此,我的最終輸出應如下所示:
ID value
A 5
B 2
C 3
D 4
E 1
A 10
B 7
C 8
D 9
E 6
A 15
B 12
C 13
D 14
E 11
A 20
B 17
C 18
D 19
E 16
我在這里使用了一個數字序列只是為了簡化示例,但我的實際值不是 1 到 20 的序列。因此,具有數字模式的解決方案在我的資料中不起作用。
謝謝!
uj5u.com熱心網友回復:
在基礎 R 中,您可以這樣做:
# matrix with indices of A's and E's in its two rows
ae <- matrix(which(df$ID %in% c('A', 'E')), nrow=2)
# switch A and E
df$value[ae] <- df$value[ae[2:1, ]]
df
# ID value
# 1 A 5
# 2 B 2
# 3 C 3
# 4 D 4
# 5 E 1
# 6 A 10
# 7 B 7
# 8 C 8
# 9 D 9
# 10 E 6
# 11 A 15
# 12 B 12
# 13 C 13
# 14 D 14
# 15 E 11
# 16 A 20
# 17 B 17
# 18 C 18
# 19 D 19
# 20 E 16
uj5u.com熱心網友回復:
這是一種dplyr方法case_when:
library(dplyr)
df %>%
group_by(gp = cumsum(ID == 'A')) %>%
mutate(value = case_when(ID == "A" ~ value[ID == "E"],
ID == "E" ~ value[ID == "A"],
TRUE ~ value)) %>%
ungroup() %>%
select(-gp)
輸出
# A tibble: 20 × 2
ID value
<chr> <dbl>
1 A 5
2 B 2
3 C 3
4 D 4
5 E 1
6 A 10
7 B 7
8 C 8
9 D 9
10 E 6
11 A 15
12 B 12
13 C 13
14 D 14
15 E 11
16 A 20
17 B 17
18 C 18
19 D 19
20 E 16
uj5u.com熱心網友回復:
最好只切換 ID:
df$ID <- ifelse(df$ID == "A", "E", ifelse(df$ID == "E", "A", df$ID))
uj5u.com熱心網友回復:
使用 data.table,“A”和“E”上的子集,然后使用矢量化索引來更新value:
library(data.table)
setDT(df)[ID %chin% c("A", "E"), value := value[1:.N c(1, -1)]][]
#> ID value
#> 1: A 5
#> 2: B 2
#> 3: C 3
#> 4: D 4
#> 5: E 1
#> 6: A 10
#> 7: B 7
#> 8: C 8
#> 9: D 9
#> 10: E 6
#> 11: A 15
#> 12: B 12
#> 13: C 13
#> 14: D 14
#> 15: E 11
#> 16: A 20
#> 17: B 17
#> 18: C 18
#> 19: D 19
#> 20: E 16
uj5u.com熱心網友回復:
可能有更短的代碼,但這里有一個建議
library(tidyverse)
df %>%
pivot_wider(names_from = ID,
values_from = value) %>%
unnest(everything()) %>%
transform(A = E,
E = A) %>%
pivot_longer(cols = everything())
# A tibble: 20 x 2
name value
<chr> <dbl>
1 A 5
2 B 2
3 C 3
4 D 4
5 E 1
6 A 10
7 B 7
8 C 8
9 D 9
10 E 6
11 A 15
12 B 12
13 C 13
14 D 14
15 E 11
16 A 20
17 B 17
18 C 18
19 D 19
20 E 16
uj5u.com熱心網友回復:
我只是簡單地切換它們。看起來這可能更漂亮,但我會保持簡單。
vA <- df$value[df$ID == "A"]
vE <- df$value[df$ID == "E"]
df$value[df$ID == "A"] <- vE
df$value[df$ID == "E"] <- vA
df
#> ID value
#> 1 A 5
#> 2 B 2
#> 3 C 3
#> 4 D 4
#> 5 E 1
#> 6 A 10
#> 7 B 7
#> 8 C 8
#> 9 D 9
#> 10 E 6
#> 11 A 15
#> 12 B 12
#> 13 C 13
#> 14 D 14
#> 15 E 11
#> 16 A 20
#> 17 B 17
#> 18 C 18
#> 19 D 19
#> 20 E 16
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/527692.html
標籤:r开关语句
下一篇:Dplyr遞回地增長資料框
