% unite(D02, D02_1, D-6ren">
gpt4 book ai didi

r - tidyr::跨列模式统一

转载 作者:行者123 更新时间:2023-12-04 11:49:31 28 4
gpt4 key购买 nike

我有一个看起来像这样的数据集

site <- c("A", "B", "C", "D", "E")
D01_1 <- c(1, 0, 0, 0, 1)
D01_2 <- c(1, 1, 0, 1, 1)
D02_1 <- c(1, 0, 1, 0, 1)
D02_2 <- c(0, 1, 0, 0, 1)
D03_1 <- c(1, 1, 0, 0, 0)
D03_2 <- c(0, 1, 0, 0, 1)
df <- data.frame(site, D01_1, D01_2, D02_1, D02_2, D03_1, D03_2)

我正在努力团结 D0x_1D0x_2列,以便列中的值用斜杠分隔。我可以使用以下代码执行此操作,并且效果很好:
library(dplyr)
library(tidyr)

df.unite <- df %>%
unite(D01, D01_1, D01_2, sep = "/", remove = TRUE) %>%
unite(D02, D02_1, D02_2, sep = "/", remove = TRUE) %>%
unite(D03, D03_1, D03_2, sep = "/", remove = TRUE)

...但问题是它需要我输入每个 unite多次配对,它在我的数据集中的大量列中很笨拙。 dplyr有办法吗?将类似模式的列名称统一起来,然后跨列循环? unite_each似乎不存在。

最佳答案

两个选项,其实是同一个东西重新排列的。

选项 1. 嵌套调用

首先,您可以使用 lapply申请 unite_ (您可以向其传递字符串的标准评估版本)以编程方式跨列。为此,您需要构建一个名称列表供它使用,然后将 lapply 包裹起来。在 do.call(cbind捕获列,和 cbind site回到它。共:

cols <- unique(substr(names(df)[-1], 1, 3))
cbind(site = df$site, do.call(cbind,
lapply(cols, function(x){unite_(df, x, grep(x, names(df), value = TRUE),
sep = '/', remove = TRUE) %>% select_(x)})
))

# site D01 D02 D03
# 1 A 1/1 1/0 1/0
# 2 B 0/1 0/1 1/1
# 3 C 0/0 1/0 0/0
# 4 D 0/1 0/0 0/0
# 5 E 1/1 1/1 0/1

选项 2:链接

或者,如果你真的喜欢管道,你实际上可以将整个东西破解成一个链(包括 lapply!),将一些基本函数换成 dplyr那些:
df %>% select(-site) %>% names() %>% substr(1,3) %>% unique() %>%
lapply(function(x){unite_(df, x, grep(x, names(df), value = TRUE),
sep = '/', remove = TRUE) %>% select_(x)}) %>%
bind_cols() %>% mutate(site = as.character(df$site)) %>% select(site, starts_with('D'))

# Source: local data frame [5 x 4]
#
# site D01 D02 D03
# (chr) (chr) (chr) (chr)
# 1 A 1/1 1/0 1/0
# 2 B 0/1 0/1 1/1
# 3 C 0/0 1/0 0/0
# 4 D 0/1 0/0 0/0
# 5 E 1/1 1/1 0/1

查看中间产品以了解它们如何组合在一起,但它与基本方法的逻辑几乎相同。

关于r - tidyr::跨列模式统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36002235/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com