gpt4 book ai didi

r - 在 R 中,如何根据名称从命名 num 创建交叉表?

转载 作者:行者123 更新时间:2023-12-02 06:26:49 25 4
gpt4 key购买 nike

我有一个数字向量,其名称遵循某种模式。每个元素的名称由两部分组成。根据以下内容,第一部分有固定数量的变体,第二部分有固定数量的变体。

x <- c(2, 4, 3, 7, 6, 9)
names(x) <- c("a.0", "b.0", "c.0", "a.1", "b.1", "c.1")

据此我想创建并打印一个表格,其中名称的第一部分是行,第二部分是下面的列。

   a   b   c
0 2 4 3
1 7 6 9

最佳答案

这里有一些可能性。前 3 个只使用 base R。

1) tapply 对第二个参数中指定的行和列部分使用 tapply

nms <- names(x)
tapply(x, list(row = sub(".*\\.", "", nms), col = sub("\\..*", "", nms)), c)

用指示的行和列名称给出以下矩阵。

   col
row a b c
0 2 4 3
1 7 6 9

2) xtabs 另一种可能性是使用xtabs:

dnms <- read.table(text = names(x), sep = ".", as.is = TRUE, 
col.names = c("col", "row"))[2:1]
xtabs(x ~ ., dnms)

给出这个 xtabs/table 对象:

   col
row a b c
0 2 4 3
1 7 6 9

3) reshape

long <- cbind(x, read.table(text = names(x), sep = ".", as.is = TRUE, 
col.names = c("col", "row")))
r <- reshape(long, dir = "wide", idvar = "row", timevar = "col")[-1]
dimnames(r) <- lapply(long[3:2], unique)

r

给出这个数据框:

  a b c
0 2 4 3
1 7 6 9

4) dplyr/tidyr/tibble 使用指定的包,我们可以形成以下管道:

library(dplyr)
library(tidyr)
library(tibble)

x %>%
stack %>%
separate(ind, c("col", "rowname")) %>%
pivot_wider(names_from = col, values_from = ".") %>%
column_to_rownames

给出这个数据框:

  a b c
0 2 4 3
1 7 6 9

如果您使用的是旧版本的 tidyr,请将 pivot_wider 行替换为

spread(col, values) %>%

根据@d.b。评论这也行:

x %>% 
data.frame %>%
rownames_to_column %>%
separate(rowname, c("col", "rowname")) %>%
pivot_wider(names_from = col, values_from = ".") %>%
column_to_rownames

关于r - 在 R 中,如何根据名称从命名 num 创建交叉表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58248982/

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