【问题标题】:combining ifelse statement mutate and sequence in dplyr pipe在 dplyr 管道中结合 ifelse 语句变异和序列
【发布时间】:2017-06-13 08:38:31
【问题描述】:

我想在像这样的 D3.js 气泡图中替换城市名称 How to display d3 bubbles in different colors for a dataset with one branch and many children?

我有很多“小城市”要可视化,我想用 id 替换它们的标签。为了更好地显示(并创建图例)。

这是一个小例子

cities <- c("Brest", "Rennes", "Rennes", "Rennes", "Nantes", "Lorient") 
dataset <- data.frame(cities)  
dataset

dataset <- dataset %>%
count(cities)

这是我的结果:n = 1 (1 = "小城市")

cities     1
Brest      1
Lorient    1
Nantes     1
Rennes     3

小城市 =

我的期望:

n = 1 的城市的 id 序列(1 = “小城市”)

cities     n     id_sequence
Brest      1     1
Lorient    1     2
Nantes     1     3
Rennes     3     NA

我正在尝试完成我的管道但没有成功:

dataset <- dataset %>%
   count(cities) %>% 
   mutate (id_sequence = ifelse (n = 1:length(cities))

感谢您的帮助!

【问题讨论】:

  • 您将条件设置为序列。

标签: r if-statement dplyr


【解决方案1】:

你可以这样做:

dataset %>%
   count(cities) %>%
   group_by(n) %>%
   mutate(id_sequence = ifelse(n == 1, 1:n(), NA))
## Source: local data frame [4 x 3]
## Groups: n [2]
## 
##    cities     n id_sequence
##    <fctr> <int>       <int>
## 1   Brest     1           1
## 2 Lorient     1           2
## 3  Nantes     1           3
## 4  Rennes     3          NA

这里的想法是按包含计数的列进行分组。在mutate() 内部,n() 将给出每组中的行数。对于n == 1 所在的组,n() 将返回 3。

【讨论】:

  • 对于我的图例,该序列必须从 1 开始,没有间隙。
  • 这就是这个解决方案的作用。
  • 感谢您的帮助。抱歉,但不在我更大的“真实”数据集中。
  • 但在这种情况下,您的真实数据与您应该得到的数据大不相同。我使用的代码将始终标记计数为 1 的城市,连续系列从 1 开始并且没有间隙。
  • 你说得对。我只是想看看 akrun 的解决方案是如何工作的,而这个却没有。他们基本上做同样的事情,因为row_numbers() 等同于1:n()
【解决方案2】:

dplyr不是必需时:

cities <- c("Brest", "Rennes", "Rennes", "Rennes", "Nantes", "Lorient") 
dataset <- data.frame(cities)  
dataset

dataset <- dataset %>%
  count(cities)

dataset$id_sequence <- NA

sequence <- seq(dim(dataset[dataset$n == 1,])[1])

dataset[dataset$n == 1,]$id_sequence <- sequence

【讨论】:

    【解决方案3】:

    我们可以试试

    dataset %>% 
        count(cities) %>% 
        group_by(grp = n==1) %>%
        mutate(id_sequence = row_number()*NA^!grp) %>%
        ungroup() %>% 
        select(-grp)
    #    cities     n id_sequence
    #    <fctr> <int>       <dbl>
    #1   Brest     1           1
    #2 Lorient     1           2
    #3  Nantes     1           3
    #4  Rennes     3          NA
    

    【讨论】:

    • 太棒了@akrun!
    • 我可以用城市名称@akrun 替换我的问题吗?
    • @Wilcar 你可以使用dataset %&gt;% count(cities) %&gt;% group_by(grp = n==1) %&gt;%mutate(id_sequence = if_else(grp, as.character(row_number()), as.character(cities))) %&gt;% ungroup() %&gt;% select(-grp)
    猜你喜欢
    • 2017-12-17
    • 2020-03-08
    • 2018-01-02
    • 1970-01-01
    • 2020-01-18
    • 2021-10-31
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多