我是R的新手,我不想从一开始就误解语言及其数据结构。 :)
我的data.frame sample.data
包含' normal'属性(例如author
)另一个嵌套的data.frame(files
)列表,例如,属性extension
。
如何过滤已创建具有特定扩展名的文件的作者?有没有一种R-ic方式呢?也许就是这个方向:
t <- subset(data, data$files[['extension']] > '.R')
其实我想避免for循环。
您可以在这里找到一些示例数据:
d1 <- data.frame(extension=c('.py', '.py', '.c++')) # and some other attributes
d2 <- data.frame(extension=c('.R', '.py')) # and some other attributes
sample.data <- data.frame(author=c('author_1', 'author_2'), files=I(list(d1, d2)))
sample.data来自的JSON看起来像
[
{
"author": "author_1",
"files": [
{
"extension": ".py",
"path": "/a/path/somewhere/"
},
{
"extension": ".c++",
"path": "/a/path/somewhere/else/"
}, ...
]
}, ...
]
答案 0 :(得分:6)
至少有十几种方法可以做到这一点,但是如果你想学习R,你应该学习数据结构子集的标准方法,特别是原子向量,列表和数据帧。这将在本书的第二章中介绍:
还有其他很棒的书,但这是一本很好的书,它是在线和免费的。
更新:好的,这会将您的json转换为数据框列表。
library("rjson")
s <- paste(c(
'[{' ,
' "author": "author_1",',
' "files": [',
' {',
' "extension": ".py",',
' "path": "/a/path/somewhere/"',
' },',
' {',
' "extension": ".c++",',
' "path": "/a/path/somewhere/else/"',
' }]',
'},',
'{',
'"author": "author_2",',
'"files": [',
' {',
' "extension": ".py",',
' "path": "/b/path/somewhere/"',
' },',
' {',
' "extension": ".c++",',
' "path": "/b/path/somewhere/else/"',
' }]',
'}]'),collapse="")
j <- fromJSON(s)
todf <- function (x) {
nrow <- length(x$files)
vext <- sapply(x$files,function (y) y[[1]])
vpath <- sapply(x$files,function (y) y[[2]])
df <- data.frame(author=rep(x$author,nrow),ext=vext,path=vpath)
}
listdf <- lapply(j,todf)
listdf
哪个收益率:
[[1]]
author ext path
1 author_1 .py /a/path/somewhere/
2 author_1 .c++ /a/path/somewhere/else/
[[2]]
author ext path
1 author_2 .py /b/path/somewhere/
2 author_2 .c++ /b/path/somewhere/else/
完成任务,合并和子集:
mdf <- do.call("rbind", listdf)
mdf[ mdf$ext==".py", ]
得到以下特性:
author ext path
1 author_1 .py /a/path/somewhere/
3 author_2 .py /b/path/somewhere/
答案 1 :(得分:3)
有趣的是,没有多少人使用R来模拟分层数据库!
subset(sample.data, sapply(files, function(df) any(df$extension == ".R")))
答案 2 :(得分:2)
假设您的数据框semalt and buttons-for-website
(如CSV)如下所示:
df
那么最简单的解决方案是使用dplyr包:
author,path,extension
john,/home/john,txt
mary,/home/mary,png
答案 3 :(得分:1)
我认为grep()
包中的base
函数可能是您的解决方案:
files <- data.frame(path = paste0("path", 1:3), extension = c (".R", ".csv", ".R")
, creation.date = c(Sys.Date()+1:3))
> files
# path extension creation.date
# 1 path1 .R 2015-07-15
# 2 path2 .csv 2015-07-16
# 3 path3 .R 2015-07-17
> files[grep(".R", files$extension),]
# extension creation.date
# 1 path1 .R 2015-07-15
# 3 path3 .R 2015-07-17