r - 根据由冒号和连接向量定义的序列字符串创建长数据格式

标签 r string tidyr sequences tidyverse

我有数据,其中每个观测值的ID是通常以X:Y形式存储为序列的数字,但有时是串联列表。我想整理数据,以便每个观察都有自己的行,这样我就可以使用联接函数添加更多描述性ID。通常,我会使用gather()中的tidyr函数来执行此操作,但是由于它们是字符,因此在解压ID时遇到了麻烦。

数据如下所示:

example <- data_frame(x = LETTERS[1:3], y = c("Condition 1", "Condition 2", "Condition 3"), z = c("1:3", "4:6", "c(7,9,10)"))

example
# A tibble: 3 × 3
      x           y         z
  <chr>       <chr>     <chr>
1     A Condition 1       1:3
2     B Condition 2       4:6
3     C Condition 3 c(7,9,10)

但是这些都不起作用,并且都产生NA:
as.numeric("1:3")
as.integer("1:3")
as.numeric("c(7,9,10)")
as.integer("c(7,9,10)")

一定有一种简单的方法可以做到这一点,但我认为一个很长的路要走,就是提取数字并将它们首先存储为列表。对于X:Y ID,我可以通过在“:”处分割字符串,然后从一个数字到另一个数字创建一个序列来做到这一点,如下所示:
example[1:2,] %>% 
+   separate(z, c("a", "b"), sep = ":") %>% 
+   mutate(a = as.numeric(a), b = as.numeric(b), new = list(seq(a, b)))
Error in eval(expr, envir, enclos) : 'from' must be of length 1

但是,这没有用。

我的目标是这样的:
# A tibble: 9 × 3
      x           y     z
  <chr>       <chr> <dbl>
1     A Condition 1     1
2     A Condition 1     2
3     A Condition 1     3
4     B Condition 2     4
5     B Condition 2     5
6     B Condition 2     6
7     C Condition 3     7
8     C Condition 3     9
9     C Condition 3    10

实现它的最简单方法是什么?

最佳答案

我们可以使用tidyverse

library(tidyverse)
example %>%
    group_by(x) %>%
    mutate(z = list(eval(parse(text=z)))) %>%
    unnest
#      x           y     z
#   <chr>       <chr> <dbl>
#1     A Condition 1     1
#2     A Condition 1     2
#3     A Condition 1     3
#4     B Condition 2     4
#5     B Condition 2     5
#6     B Condition 2     6
#7     C Condition 3     7
#8     C Condition 3     9
#9     C Condition 3    10

关于r - 根据由冒号和连接向量定义的序列字符串创建长数据格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43510938/

相关文章:

r - 绘制 3d 密度

ios - 如何在 swift 2 中的已解析 xml 变量中使用正则表达式获取时间模式

r - 创建一个函数以从数据中添加因子列

javascript - 在 JavaScript 中生成所有可能的可变长度逗号分隔字符串组合

r - 迭代地分层循环行,直到满足条件

r - 在R中解聚合/反汇总/扩展数据集

r - 在 Shiny 中的 conditionalPanel 中添加多个条件

r - 如何将警告()输出到字符串

r - 在 R 中解码 base64 字符串会产生意外的二进制输出

java - String.replaceAll() 在我的循环中不起作用