R 用数据帧的一个列的值对数据帧进行子集设置

R 用数据帧的一个列的值对数据帧进行子集设置,r,subset,R,Subset,我有一个相当大的数据帧。以下是一个简化的示例: Group Element Value Note 1 AAA 11 Good 1 ABA 12 Good 1 AVA 13 Good 2 CBA 14 Good 2 FDA 14 Good 3 JHA 16 Good 3 AHF 16 Good 3 AKF 17 Good

我有一个相当大的数据帧。以下是一个简化的示例:

Group Element Value Note
1     AAA     11    Good
1     ABA     12    Good
1     AVA     13    Good
2     CBA     14    Good
2     FDA     14    Good
3     JHA     16    Good
3     AHF     16    Good
3     AKF     17    Good
这里是一个
dput

dat <- structure(list(Group = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L), Element = structure(c(1L, 
2L, 5L, 6L, 7L, 8L, 3L, 4L), .Label = c("AAA", "ABA", "AHF", 
"AKF", "AVA", "CBA", "FDA", "JHA"), class = "factor"), Value = c(11L, 
12L, 13L, 14L, 14L, 16L, 16L, 17L), Note = structure(c(1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L), .Label = "Good", class = "factor")), .Names = c("Group", 
"Element", "Value", "Note"), class = "data.frame", row.names = c(NA, 
-8L))
第2组:

2     CBA     14    Good
2     FDA     14    Good

依此类推。

您可以使用
split
进行此操作

> dat
##   Group Element Value Note
## 1     1     AAA    11 Good
## 2     1     ABA    12 Good
## 3     1     AVA    13 Good
## 4     2     CBA    14 Good
## 5     2     FDA    14 Good
## 6     3     JHA    16 Good
## 7     3     AHF    16 Good
## 8     3     AKF    17 Good

> x <- split(dat, dat$Group)
添加:由于您在评论中询问了它,您可以使用
write.csv
lappy
将每个数据帧写入文件。
不可见的
包装器只是为了抑制
lappy的输出

> invisible(lapply(seq(x), function(i){
      write.csv(x[[i]], file = paste0(i, ".csv"), row.names = FALSE)
  }))
我们可以通过查看
list.files

> list.files(pattern = "^[0-9].csv")
## [1] "1.csv" "2.csv" "3.csv"
我们可以通过
read.csv

> read.csv("3.csv")
##   Group Element Value Note
## 1     3     JHA    16 Good
## 2     3     AHF    16 Good
## 3     3     AKF    17 Good

您可以为此使用
split

> dat
##   Group Element Value Note
## 1     1     AAA    11 Good
## 2     1     ABA    12 Good
## 3     1     AVA    13 Good
## 4     2     CBA    14 Good
## 5     2     FDA    14 Good
## 6     3     JHA    16 Good
## 7     3     AHF    16 Good
## 8     3     AKF    17 Good

> x <- split(dat, dat$Group)
添加:由于您在评论中询问了它,您可以使用
write.csv
lappy
将每个数据帧写入文件。
不可见的
包装器只是为了抑制
lappy的输出

> invisible(lapply(seq(x), function(i){
      write.csv(x[[i]], file = paste0(i, ".csv"), row.names = FALSE)
  }))
我们可以通过查看
list.files

> list.files(pattern = "^[0-9].csv")
## [1] "1.csv" "2.csv" "3.csv"
我们可以通过
read.csv

> read.csv("3.csv")
##   Group Element Value Note
## 1     3     JHA    16 Good
## 2     3     AHF    16 Good
## 3     3     AKF    17 Good

强制性
plyr
版本(与Richard的版本相当,但我敢打赌速度也较慢:

library(plyr)

groups <- dlply(dat, .(Group), function(x) { return(x) })

length(groups)
## [1] 3

groups$`1` # can also do groups[[1]]
##   Group Element Value Note
## 1     1     AAA    11 Good
## 2     1     ABA    12 Good
## 3     1     AVA    13 Good

groups[[2]]
##   Group Element Value Note
## 1     2     CBA    14 Good
## 2     2     FDA    14 Good
库(plyr)

组强制性
plyr
版本(与Richard的版本相当,但我敢打赌速度也较慢:

library(plyr)

groups <- dlply(dat, .(Group), function(x) { return(x) })

length(groups)
## [1] 3

groups$`1` # can also do groups[[1]]
##   Group Element Value Note
## 1     1     AAA    11 Good
## 2     1     ABA    12 Good
## 3     1     AVA    13 Good

groups[[2]]
##   Group Element Value Note
## 1     2     CBA    14 Good
## 2     2     FDA    14 Good
库(plyr)

组谢谢。如何从拆分中创建新的数据帧?它们已作为列表的元素创建。将变量(例如
x
)分配给
split(D,D$Group)
。然后您可以使用
x[[1]]
x[[2]]按组号访问每个单独的数据帧
,等等。我更新了答案以反映这一点。是否有可能将这两个数据帧写入两个不同的文件,默认名称为1.csv、2.csv等等?若要从拆分中创建新的数据帧,可能很方便。如果组值为字符,您将如何处理同一任务?谢谢。我如何创建新的数据帧从拆分?它们已经作为列表的元素创建。将一个变量(例如
x
)分配给
split(D,D$Group)
。然后您可以使用
x[[1]]
x[[2]]按组号访问每个数据帧
,等等。我更新了答案以反映这一点。是否有可能将这两个数据帧写入两个不同的文件,默认名称为1.csv、2.csv等等?若要从拆分中创建新的数据帧,可能很方便。如果组值为字符,您将如何处理同一任务?