2016-04-23 64 views
0

我有一个数据集看起来是这样的:基于另一列中选择数据的子集

 Area  Num 
[1,] "Area 1" "99" 
[2,] "Area 3" "85" 
[3,] "Area 1" "60" 
[4,] "Area 2" "90" 
[5,] "Area 1" "40" 
[6,] "Area 3" NA  
[7,] "Area 4" "10" 
... 

代码:

structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
"Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 
2L), .Dimnames = list(NULL, c("Area", "Num"))) 

我需要做值的一些计算中Num每个例如计算每个Area或每个Areasummary的总和。

我正在考虑使用nested for循环来实现这一点,但我不知道如何去做。

+2

首先,我建议您在列有不同类型时使用data.frame而不是矩阵(您的示例数据集是矩阵,其中第二列可能已从数字转换为字符) e矩阵仅支持一种元素类型) – digEmAll

+1

然后,您不需要循环来执行这些汇总计算,例如,你可以使用'by','aggregate'或'split'功能... – digEmAll

回答

2

您可以使用aggregate来完成此操作,但使用dplyr软件包可以很容易地处理这些问题。虽然这个问题有很多重复。

library(dplyr) 

df <- structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
        "Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 
                         2L), .Dimnames = list(NULL, c("Area", "Num"))) 


df <- data.frame(df) 
df$Num <- as.numeric(df$Num) 

df2 <- df %>% 
    group_by(Area) %>% 
    summarise(totalNum = sum(Num, na.rm=T)) 

df2 
+0

我认为你应该更新你的答案inculde na.rm = True,否则区域3将是NA – aelwan

1

否则使用data.table

library(data.table) 

dt <- data.table(df) 

dt[,sum(as.numeric(Num),na.rm=T),by=Area] 
##   Area V1 
## 1: Area 1 199 
## 2: Area 3 85 
## 3: Area 2 90 
## 4: Area 4 10 
2

为了功能适用于因子的每个级别同样的事情,我们可以递归到by功能:

dt <- structure(c("Area 1", "Area 3", "Area 1", "Area 2", "Area 1", 
       "Area 3", "Area 4", "99", "85", "60", "90", "40", NA, "10"), .Dim = c(7L, 2L), .Dimnames = list(NULL, c("Area", "Num"))) 


dt <- data.frame(dt) 
dt$Num <- as.numeric(dt$Num) 

t <- by(dt$Num, dt$Area, sum) 
t 
+0

这种方法可行,但不是理想的解决方案;实际数据集包含许多不同的“区域”。一一命名它们根本不可行。 – Edwin

+0

我的错。我用更合适的解决方案编辑了这个问题。我希望它能正常工作。 – Worice

+0

是的,它太棒了!我试图学习用不同的方法来做一件事。 – Edwin

相关问题