這個問題與這個問題有關我的問題是關于 R:如何在 R 中為表中的每個重復編號?
基本上重復編號的地方。例如兩次重復: 1,2 ;三個重復:1,2,3 等...但如果值是唯一的(只有一次),它應該沒有1但NA
資料:(來自 akrun,非常感謝!)
df1 <- structure(list(Fullname = c("Peter", "Peter", "Alison", "Warren",
"Jack", "Jack", "Jack", "Jack", "Susan", "Susan", "Henry", "Walison",
"Tinder", "Peter", "Henry", "Tinder")), row.names = c(NA, -16L
), class = "data.frame")
我的解決方案是這樣的:
df1 %>%
group_by(Fullname) %>%
mutate(newcol = seq_along(Fullname))
Fullname newcol
<chr> <int>
1 Peter 1
2 Peter 2
3 Alison 1
4 Warren 1
5 Jack 1
6 Jack 2
7 Jack 3
8 Jack 4
9 Susan 1
10 Susan 2
11 Henry 1
12 Walison 1
13 Tinder 1
14 Peter 3
15 Henry 2
16 Tinder 2
現在我嘗試將每個出現一次的值(例如 Alison、Warren 和 Henry)設定為NA像 akrun 在這里所做的那樣我的問題是關于 R:如何在 R 中為表中的每個重復編號?
我的代碼帶有ifelse檢查組總和是否大于 1的陳述句。
df1 %>%
group_by(Fullname) %>%
mutate(newcol = seq_along(Fullname)) %>%
mutate(newcol = ifelse(sum(newcol)>1, newcol, NA))
但我得到:
Fullname newcol
<chr> <int>
1 Peter 1
2 Peter 1
3 Alison NA
4 Warren NA
5 Jack 1
6 Jack 1
7 Jack 1
8 Jack 1
9 Susan 1
10 Susan 1
11 Henry 1
12 Walison NA
13 Tinder 1
14 Peter 1
15 Henry 1
16 Tinder 1
我不明白為什么?
uj5u.com熱心網友回復:
我們需要if/else在這里而不是ifelse因為ifelse要求所有引數的長度相同,sum回傳一個值,如果是TRUE,則全部變為 TRUE
library(dplyr)
df1 %>%
group_by(Fullname) %>%
mutate(newcol = row_number(),
newcol = if(sum(newcol)> 1) newcol else NA) %>%
ungroup
-輸出
# A tibble: 16 × 2
Fullname newcol
<chr> <int>
1 Peter 1
2 Peter 2
3 Alison NA
4 Warren NA
5 Jack 1
6 Jack 2
7 Jack 3
8 Jack 4
9 Susan 1
10 Susan 2
11 Henry 1
12 Walison NA
13 Tinder 1
14 Peter 3
15 Henry 2
16 Tinder 2
現在,我們來看這個問題。'newcol2' 值是單個 TRUE/FALSE 的回收值。在 中ifelse,由于所有引數的長度都需要相同,因此邏輯部分的長度僅為 1。
df1 %>%
group_by(Fullname) %>%
mutate(newcol = row_number(), newcol2 = sum(newcol) > 1)
# A tibble: 16 × 3
# Groups: Fullname [8]
Fullname newcol newcol2
<chr> <int> <lgl>
1 Peter 1 TRUE
2 Peter 2 TRUE
3 Alison 1 FALSE
4 Warren 1 FALSE
5 Jack 1 TRUE
6 Jack 2 TRUE
7 Jack 3 TRUE
8 Jack 4 TRUE
9 Susan 1 TRUE
10 Susan 2 TRUE
11 Henry 1 TRUE
12 Walison 1 FALSE
13 Tinder 1 TRUE
14 Peter 3 TRUE
15 Henry 2 TRUE
16 Tinder 2 TRUE
解決方法是rep使長度相同
df1 %>%
group_by(Fullname) %>%
mutate(newcol = seq_along(Fullname)) %>%
mutate(newcol = ifelse(rep(sum(newcol)>1, n()), newcol, NA))
# A tibble: 16 × 2
# Groups: Fullname [8]
Fullname newcol
<chr> <int>
1 Peter 1
2 Peter 2
3 Alison NA
4 Warren NA
5 Jack 1
6 Jack 2
7 Jack 3
8 Jack 4
9 Susan 1
10 Susan 2
11 Henry 1
12 Walison NA
13 Tinder 1
14 Peter 3
15 Henry 2
16 Tinder 2
為了更好地理解它,只需取一個簡單的向量
> v1 <- c(1:5)
> sum(v1) > 4
[1] TRUE
> ifelse(sum(v1) > 4, v1, NA)
[1] 1
在sum這里是15,它肯定大于4中。一旦TRUE被發現,它只是回傳的載體,即1和停止的第一要素。在%>%也,這就是正在發生的事情,但是因為有回收,1 被重復以填充整個組
uj5u.com熱心網友回復:
前提是您已經了解錯誤發生的原因。但是,我認為sum這不是在這里使用的正確功能。是的,你可以讓它作業,但它看起來很復雜。您可以使用n()獲取組中的行數并使用if條件進行檢查。
library(dplyr)
df1 %>%
group_by(Fullname) %>%
mutate(newcol = if(n() == 1) NA else row_number()) %>%
ungroup
# Fullname newcol
# <chr> <int>
# 1 Peter 1
# 2 Peter 2
# 3 Alison NA
# 4 Warren NA
# 5 Jack 1
# 6 Jack 2
# 7 Jack 3
# 8 Jack 4
# 9 Susan 1
#10 Susan 2
#11 Henry 1
#12 Walison NA
#13 Tinder 1
#14 Peter 3
#15 Henry 2
#16 Tinder 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316377.html
上一篇:PHP phar詳解
