使用R计算数据集中每个组的正态性
我有一个大约7个LAC条目的数据集。假设它有5列:使用R计算数据集中每个组的正态性,r,group-by,statistics,data-analysis,bigdata,R,Group By,Statistics,Data Analysis,Bigdata,我有一个大约7个LAC条目的数据集。假设它有5列: Cust_Id(around 340 unique Ids), Expense_Type, Expense($), Income_Type and Income($). 我想检查通过统计分析确定的任何Cust\u Id组内收入和支出的相对稳定性 我使用R的summaryBy函数找出了数据的统计信息(平均值、中位数、标准差) 现在我想找到每组Cust\u Id的正态性。我使用了shapiro.test()函数,但它会得到整个数据的正常性分数,而
Cust_Id(around 340 unique Ids), Expense_Type, Expense($), Income_Type and Income($).
我想检查通过统计分析确定的任何Cust\u Id
组内收入和支出的相对稳定性
我使用R的summaryBy
函数找出了数据的统计信息(平均值、中位数、标准差)
现在我想找到每组Cust\u Id
的正态性。我使用了shapiro.test()
函数,但它会得到整个数据的正常性分数,而不是分组值的正常性分数。我在解决需求的正确路径上吗?我是这个领域的新手。请提出解决方法
样本数据:
Cust_Id Income_Type Income Expense_Type Expense
10001 ABC 4356.89 XYZ 569.45
10003 DEF 5678.34 PQR 4532.43
10006 FRG 5783.43 JHK 9724.56
10001 DEG 5345.34 HTY 7856.34
10008 HGT 678.67 KIL 7893.13
10003 GRT 678.67 JHK 6544.11
我不确定我是否理解这个问题。示例数据会有所帮助。如果您希望测试每个列的正态性,那么只需在每个相关列上运行测试即可 例如,如果您的数据集名为
data
,并且是一个data.table,请参见class(data)
:
对于一个id:
id_10 <- data[Cust_Id == 10]
要循环它们,请执行以下操作:
for(i in unique(data$Cust_Id)){
u <- setDT(data)[Cust_Id == i]
s <- shapiro.test(u$Expense)
print(i)
print(s)
}
另一种方法是按唯一id进行拆分:
z<-split(data,data$Cust_Id)
for(i in z){print(shapiro.test(i$Expense))}
z尝试将数据子集,您可以使用循环并将结果存储在列表中
listids <- list()
for (ids in unique(df$Cust_Ids)){
subdf <- subset(x=df, subset=Cust_Ids==ids)
# apply the rest of your analysis there using subdf, for instance
listids[[ids]] <- shapiro.test(subdf$Expense)
}
listids就像Oli说的那样,你也可以使用apply,这会更快。当帮助新用户时,重要的是要让简单的东西,比如数据帧的名称完全符合他们的要求。您知道如何更改名称以匹配,但他们不知道。您使用列Id
命名了对象Cust\u Id
,并且使用列Cust\u Id
命名了对象df
。我知道OP在问题中没有提供数据帧名称,但即使这样,调用对象Cust\u Id
肯定会导致错误。您是对的,我读得不对。我将做相应的更改。@Cedric此代码再次返回一个空的数据帧subdf。您正在查找的测试中是否有特定的值?您是否尝试过我的任何值?最后一个使用split的方法非常简单。调用您的示例数据数据,并将每个id组的收入正常值的费用($)更改为收入,就像您试图处理Cedric的回答一样。对不起,我以为您的数据框名为Cust_id,我更改了脚本。@Pierre我想找到每个客户Id组的收入和支出的正常分数。嘿,我从两种方法中都得到了结果。对代码进行了一些小的调整,最后完成了。谢谢大家!!R不接受美元的价值。我试过使用你的代码,但不起作用。错误为“意外的“$”。我删除了$并使用了数据[“Cust_Id”],然后再次得到错误“当我是data.table(或字符向量)时,x必须键入(即排序,并标记为排序)”。我对数据框进行了排序,但还是出现了相同的错误。我将您的示例数据复制到excel中。使用空格分隔符将其拆分为更多列。然后复制它并通过执行以下操作将其输入到R中:x不要使用费用($)
作为列的名称。很明显,在这个例子中,OP帮助我们了解它所持有的数据类型。在他们的示例数据框中,您可以看到列标题,包括Expense
。我将编辑我的答案以反映您添加的示例数据@Oli,我已经检查过了。我的数据集是一个数据表。我使用了你修改过的代码,但仍然没有得到任何结果。
for(i in unique(data$Cust_Id)){
u <- setDT(data)[Cust_Id == i]
s <- shapiro.test(u$Expense)
print(i)
print(s)
}
for(i in unique(data$Cust_Id)){
assign(paste0("id",i),setDT(data)[Cust_Id== i])
}
z<-split(data,data$Cust_Id)
for(i in z){print(shapiro.test(i$Expense))}
x <- data.frame(a=c(1,1,1,2,2,2,3,3,3,4,4,4),y=c(100,10,20,20,35,50,1,2,3,4,5,100),z=c(1,2,3,4,5,6,7,8,9,10,11,12))
df <- setDT(x)[, .(Normality_y = shapiro.test(y), Normality_z = shapiro.test(z), Count = .N), by = a]
library(plyr)
df2 <- ddply(df, "a", function(z) head(z,2))
listids <- list()
for (ids in unique(df$Cust_Ids)){
subdf <- subset(x=df, subset=Cust_Ids==ids)
# apply the rest of your analysis there using subdf, for instance
listids[[ids]] <- shapiro.test(subdf$Expense)
}