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等等?若要从拆分中创建新的数据帧,可能很方便。如果组值为字符,您将如何处理同一任务?