如何将多个观测值与一列分开,并将它们与具有多个观测值的另一列进行匹配?

How do I separate multiple observations from one column and match them with another column with multiple observations?

提问人:Puzzler 提问时间:10/26/2023 最后编辑:ThomasIsCodingPuzzler 更新时间:10/26/2023 访问量:60

问:

我在两列的单元格中有多个观察结果。它们按顺序记录,因此每个观测值都与其旁边列中的其他观测值相对应。

dat <- data.frame(id = c("1,2", "2,3", "3, 4, 5, 6"), 
                  location = c("N,S", "S,N", "N,N,N,S")
                  )

我想将这些单元格中的数据分开,以便第一列是数字 1-6,第二列是相应的位置 N 或 S。

我尝试使用pivot_longer()和separate_rows(),但仍然没有运气。

R 字符串 数据帧

评论

0赞 PGSA 10/26/2023
他们会始终如一吗?(即在给定数据集中,“2”是否始终是“N”?

答:

1赞 Friede 10/26/2023 #1

你在寻找吗

dat <- data.frame(id = c("1,2", "2,3", "3, 4, 5, 6"), 
                  location = c("N,S", "S,N", "N,N,N,S")
                  )

dat <- apply(X = dat, 
             MARGIN = 2, 
             FUN = \(x) unlist(strsplit(x, ","))
             ) |> 
  as.data.frame() |>
  unique()
dat
#>   id location
#> 1  1        N
#> 2  2        S
#> 4  3        N
#> 6  4        N
#> 7  5        N
#> 8  6        S

创建于 2023-10-26 使用 reprex v2.0.2

这是一种方法,不需要外部包。base R

W. r. t. @Paul Stafford Allen 在下面的评论中,您可能希望补充 to obtain every only once,这假设数据是一致的。|> unique()id

评论

1赞 PGSA 10/26/2023
不错的答案。我认为要完全匹配 OP 请求,可能会添加一个管道来完成它?dplyr::distinct()
2赞 ThomasIsCoding 10/26/2023 #2

您可以从包装中使用 tidyrseparate_longer_delim

dat %>%
    separate_longer_delim(everything(), ",")

这给了

  id location
1  1        N
2  2        S
3  2        S
4  3        N
5  3        N
6  4        N
7  5        N
8  6        S

如果只想保留唯一行,则追加到上面的代码中distinct()

dat %>%
    separate_longer_delim(everything(), ",") %>%
    distinct()

这样

  id location
1  1        N
2  2        S
3  3        N
4  4        N
5  5        N
6  6        S

如果你更喜欢 Base R,你可以试试

type.convert(
    unique(
        list2DF(
            lapply(
                dat,
                \(x) trimws(unlist(strsplit(x, ",")))
            )
        )
    ),
    as.is = TRUE
)

这给了

  id location
1  1        N
2  2        S
4  3        N
6  4        N
7  5        N
8  6        S

评论

1赞 Puzzler 10/26/2023
谢谢,这非常完美。使用 distinct() 时出现错误。但是,我只是用了,这就成功了。Error in UseMethod("distinct") : no applicable method for 'distinct' applied to an object of class "NULL"|> unique
0赞 ThomasIsCoding 10/26/2023
@Puzzler您使用的是哪个版本?如果它仍然给出错误,则可以使其相同。dplyrunique
0赞 Puzzler 10/26/2023
目前运行的是 1.1.2,但我看到 1.1.3 是当前版本,所以我会更新并再次尝试。
0赞 jay.sf 10/26/2023 #3

lapply strsplit在柱子上。

> lapply(dat, strsplit, split=',\\s*') |> sapply(unlist) |> as.data.frame() |> type.convert(as.is=TRUE)
  id location
1  1        N
2  2        S
3  2        S
4  3        N
5  3        N
6  4        N
7  5        N
8  6        S

如果需要,您可以通过管道进入。unlist()