gpt4 book ai didi

r - 如何对数据表的列和行进行复杂的计算?

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

我正在学习操作 data.table 变量的语法。虽然我可以做简单的事情,但对于更复杂的任务,我的理解还不够透彻。例如,我想将以下数据转换为每行有一个不同的“类型”值,根据“子类型”的值生成单独的列,并且当有多行具有相同的“类型/子类型”时折叠唯一值"组合。

给定输入数据:

data = data.frame(
var1 = c("a","b","c","b","d","e","f"),
var2 = c("aa","bb","cc","dd","ee","ee","ff"),
subtype = c("1","2","2","2","1","1","2"),
type = c("A","A","A","A","B","B","B")
)

var1 var2 subtype type
1 a aa 1 A
2 b bb 2 A
3 c cc 2 A
4 b dd 2 A
5 d ee 1 B
6 e ee 1 B
7 f ff 2 B

我想得出:

  1.var1 1.var2 2.var1 2.var2     2.type
A "a" "aa" "b|c" "bb|cc|dd" "A"
B "d|e" "ee" "f" "ff" "B"

使用数据框,我可以通过以下代码实现这一点:

data.derived = do.call(
rbind,
lapply(
split(data,list(data$type)),
function(x) {
do.call (
c,
lapply(
split(x, list(x$subtype)),
function(y) {
result = c(
var1 = paste(unique(y$var1),collapse ="|"),
var2 = paste(unique(y$var2),collapse ="|")
)
if (as.character(y$subtype[1]) == "2") {
result = c(result, type = as.character(y$type[1]))
}
result}))}))

我如何使用数据表做同样的事情?

最佳答案

从您的结果中,可以清楚地看到您正在将数据从长格式转换为宽格式,并且子类型沿行方向传播,因此您需要 data.table< 中的 dcast/。由于您希望将 var1var2 中的值聚合为单个字符串,因此您需要将聚合函数自定义为 paste 以折叠结果:

library(data.table)
setDT(data)
dcast(data, type ~ subtype, value.var = c("var1", "var2"),
fun = function(v) paste0(unique(v), collapse = "|"))

# type var1_function_1 var1_function_2 var2_function_1 var2_function_2
# 1: A a b|c aa bb|cc|dd
# 2: B d|e f ee ff

关于r - 如何对数据表的列和行进行复杂的计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38923152/

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