如何根据拆分数据帧中的列表选择数据,然后在R中重新组合

时间:2017-02-02 07:09:47

标签: r

我正在尝试执行以下操作。我有一个数据集Test

 Item_ID     Test_No        Category    Sharpness       Weight   Viscocity 
 132           1              3        14.93199362  94.37250417 579.4236727
 676           1              4        44.58750591  70.03232054 1829.170727
 699           2              5        89.02760079  54.30587287 1169.226863
 850           3              6        30.74535903  83.84377678 707.2280513
 951           4              237      67.79568019  51.10388484 917.6609965
1031           5              56       74.06697003  63.31274502 1981.17804
1175           4              354      98.9656142   97.7523884  100.7357981
1483           5              726      9.958040999  51.29537311 1222.910211
1529           7              800      64.11430235  65.69780939 573.8266137
1698           9              125      67.83105185  96.53847341 486.9620194
1748           9              1005     49.43602318  52.9139591  1881.740184
2005           9              28       26.89821508  82.12663209 1709.556135
2111           2              76       83.03593144  85.23622731 276.5088502

我希望根据Test_No拆分此数据,然后根据Category和中位数Test_No计算唯一Category的数量。我选择以下列方式使用split和Sappply。但是,我收到关于缺少括号的错误。我的做法有什么不对吗?请在下面找到我的代码:

function(CatRange){
  c(Cat_Count = length(unique(CatRange$Category)), Median_Cat = median(unique(CatRange$Category), na.rm = TRUE) )
}

CatStat <- do.call(rbind,sapply(split(Test, Test$Test_No), function(ModRange)))

追加我的问题: 我想显示包含以下信息的数据: Test_NoCategoryMedian_CatCat_Count

1 个答案:

答案 0 :(得分:1)

我们可以尝试dplyr

library(dplyr)
Test %>%
  group_by(Test_No) %>%
  summarise(Cat_Count = n_distinct(Category), 
            Median_Cat = median(Category,na.rm = TRUE), 
            Category = toString(Category))

#    Test_No Cat_Count   Median_Cat  Category
#    <int>  <int>         <dbl>         <chr>
#1       1      2          3.5           3, 4
#2       2      2          40.5         5, 76
#3       3      1          6.0              6
#4       4      2         295.5      237, 354
#5       5      2         391.0       56, 726
#6       7      1         800.0           800
#7       9      3         125.0 125, 1005, 28

或者,如果您更喜欢基地R,我们也可以尝试使用aggregate

aggregate(Category~Test_No, CatRange, function(x) c(Cat_Count = length(unique(x)), 
                   Median_Cat = median(x,na.rm = TRUE), Category = toString(x)))

就编写的函数而言,我认为其中存在一些synatx问题。

new_func <- function(CatRange){
 c(Cat_Count = length(unique(CatRange$Category)), 
   Median_Cat = median(unique(CatRange$Category), na.rm = TRUE), 
   Category = toString(CatRange$Category))
}

data.frame(t(sapply(split(CatRange, CatRange$Test_No), new_func)))

#  Cat_Count Median_Cat      Category
#1         2        3.5          3, 4
#2         2       40.5         5, 76
#3         1          6             6
#4         2      295.5      237, 354
#5         2        391       56, 726
#7         1        800           800
#9         3        125 125, 1005, 28