提问人:Puzzler 提问时间:10/26/2023 最后编辑:ThomasIsCodingPuzzler 更新时间:10/26/2023 访问量:60
如何将多个观测值与一列分开,并将它们与具有多个观测值的另一列进行匹配?
How do I separate multiple observations from one column and match them with another column with multiple observations?
问:
我在两列的单元格中有多个观察结果。它们按顺序记录,因此每个观测值都与其旁边列中的其他观测值相对应。
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(),但仍然没有运气。
答:
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
您可以从包装中使用 tidyr
separate_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您使用的是哪个版本?如果它仍然给出错误,则可以使其相同。dplyr
unique
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()
上一个:改变条件后提取子字符串
下一个:根据另一列值在一列中拆分字符串
评论