Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R计算数据集中每个组的正态性_R_Group By_Statistics_Data Analysis_Bigdata - Fatal编程技术网

使用R计算数据集中每个组的正态性

使用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()函数,但它会得到整个数据的正常性分数,而

我有一个大约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  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)
}