在 R 中的函数内转置数据帧
transposing a dataframe inside a fuction in R
我有一个非常大的 df 需要过滤、分组、汇总和重新排列,以便由不同的程序进一步处理。我可以一次只做一行代码,但我需要概括。起始数据框格式如下:
uniqueID
year
header_1
header_2
m
n
etc.
0001
1990
x
TRUE
0002
1990
y
FALSE
other data
0003
1995
x
FALSE
最后的结果应该是这样的,对于 df d 中的单个年份 y,其中 a = header_1 and b = header_2:
header_1
TRUE
FALSE
x
count(x)
count(x)
y
count(y)
count(y)
z
count(z)
count(z)
slice <- function (d,y,a,b) {
t <- filter(d, year %in% c(y))
c1 <- group_by(t, {{a}}, {{b}}) %>%
summarise(count = n())
c2 <- c1 %>% pivot_wider(names_from = {{a}}, values_from = count)
h <- c2$a
c3 <- as.data.frame(t(c2[,-1]))
colnames(c3) <- h
}
我收到错误:无法转换名称重复的数据框。另外: 警告信息:
未知或未初始化的列:a
.
同样,我不确定为什么在我明确命名对象时会起作用,但在我尝试替换变量时会中断。
我有点理解第 6 行的未初始化列 'a' 并且我尝试以多种方式应用双大括号(包括第 6 到 8 行周围的所有行),但我一定是把它们放在了错误的位置。还尝试插入一个显式语句来命名行,如下所示:
c3$name <- factor(row.names(c2))
但似乎无法在换位错误上取得进展。欣赏任何可以散发的光。
编辑以添加示例数据:
id <- c("001", "002", "003", "004", "005", "006", "007")
year <- c(1990, 1990, 1995, 2000, 1995, 2000, 2000)
header_1 <- c(x, y, x, z, y, z, x)
header_2 <- c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE)
d <- data.frame(id, year, header_1, header_2)
以 2000 年为例,这是一个生成您想要的结构的解决方案:
slice <- function (d, y, a, b){
c2 <- filter(d, year %in% c(y)) %>%
group_by({{a}}, {{b}}) %>%
summarise(count = n()) %>%
pivot_wider(names_from = {{b}}, values_from = count)
}
df <- slice(d, 2000, header_1, header_2)
我有一个非常大的 df 需要过滤、分组、汇总和重新排列,以便由不同的程序进一步处理。我可以一次只做一行代码,但我需要概括。起始数据框格式如下:
uniqueID | year | header_1 | header_2 | m | n | etc. |
---|---|---|---|---|---|---|
0001 | 1990 | x | TRUE | |||
0002 | 1990 | y | FALSE | other data | ||
0003 | 1995 | x | FALSE |
最后的结果应该是这样的,对于 df d 中的单个年份 y,其中 a = header_1 and b = header_2:
header_1 | TRUE | FALSE |
---|---|---|
x | count(x) | count(x) |
y | count(y) | count(y) |
z | count(z) | count(z) |
slice <- function (d,y,a,b) {
t <- filter(d, year %in% c(y))
c1 <- group_by(t, {{a}}, {{b}}) %>%
summarise(count = n())
c2 <- c1 %>% pivot_wider(names_from = {{a}}, values_from = count)
h <- c2$a
c3 <- as.data.frame(t(c2[,-1]))
colnames(c3) <- h
}
我收到错误:无法转换名称重复的数据框。另外: 警告信息:
未知或未初始化的列:a
.
同样,我不确定为什么在我明确命名对象时会起作用,但在我尝试替换变量时会中断。 我有点理解第 6 行的未初始化列 'a' 并且我尝试以多种方式应用双大括号(包括第 6 到 8 行周围的所有行),但我一定是把它们放在了错误的位置。还尝试插入一个显式语句来命名行,如下所示:
c3$name <- factor(row.names(c2))
但似乎无法在换位错误上取得进展。欣赏任何可以散发的光。
编辑以添加示例数据:
id <- c("001", "002", "003", "004", "005", "006", "007")
year <- c(1990, 1990, 1995, 2000, 1995, 2000, 2000)
header_1 <- c(x, y, x, z, y, z, x)
header_2 <- c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE)
d <- data.frame(id, year, header_1, header_2)
以 2000 年为例,这是一个生成您想要的结构的解决方案:
slice <- function (d, y, a, b){
c2 <- filter(d, year %in% c(y)) %>%
group_by({{a}}, {{b}}) %>%
summarise(count = n()) %>%
pivot_wider(names_from = {{b}}, values_from = count)
}
df <- slice(d, 2000, header_1, header_2)