我有3个数据集。所有这些都有一列名为ID
。我想列出整个3个表的每个ID
(我不确定我正在解释正确)。例如
df1
ID age
1 34
2 33
5 34
7 35
43 32
76 33
df2
ID height
1 178
2 176
5 166
7 159
43 180
76 178
df3
ID class type
1 a 1
2 b 1
5 a 2
7 b 3
43 b 2
76 a 3
我想要一个看起来像这样的输出
ID = 1
df1 age
34
df2 height
178
df3 class type
a 1
ID = 2
df1 age
33
df2 height
176
df3 class type
b 1
我写了一个剧本
listing <- function(x) {
for(i in 1:n) {
data <- print(x[x$ID == 'i', ])
print(data)
}
return(data)
}
为什么我没有得到我想要的输出?
答案 0 :(得分:1)
这是一个黑客。如果您想要/需要导出到word文档,我强烈建议您使用knitr
(以及幕后的RStudio使用R-Markdown之类的内容(例如pandoc
) )。我鼓励您查看knitr::kable
,以及更好的循环结构来处理大量数据集。
这种黑客可以大大改善。但它可以为您提供所需的输出。
func <- function(...) {
dfnames <- as.character(match.call()[-1])
dfs <- setNames(list(...), dfnames)
IDs <- unique(unlist(lapply(dfs, `[[`, "ID")))
fmt <- paste("%", max(nchar(dfnames)), "s %s", sep = "")
for (id in IDs) {
cat(sprintf("ID = %d\n", id))
for (nm in dfnames) {
df <- dfs[[nm]][ dfs[[nm]]$ID == id, names(dfs[[nm]]) != "ID", drop =FALSE]
cat(paste(sprintf(fmt, c(nm, ""),
capture.output(print(df, row.names = FALSE))),
collapse = "\n"), "\n")
}
}
}
执行。虽然这只显示了两个data.frames,但您可以在函数参数中提供任意数量的data.frames(并按您的首选顺序)。它假设您将它们作为直接变量提供,而不是在函数调用中进行子集化...如果您尝试它,您将会理解。
func(df1, df3)
# ID = 1
# df1 age
# 34
# df3 class type
# a 1
# ID = 2
# df1 age
# 33
# df3 class type
# b 1
# ID = 5
# df1 age
# 34
# df3 class type
# a 2
# ID = 7
# df1 age
# 35
# df3 class type
# b 3
# ID = 43
# df1 age
# 32
# df3 class type
# b 2
# ID = 76
# df1 age
# 33
# df3 class type
# a 3
(就个人而言,我无法想象以这种格式提供输出,但我不知道你的口味或用例。还有很多其他方法可以显示这样的数据。喜欢:
Reduce(function(x,y) merge(x, y, by = "ID"), list(df1, df2, df3))
# ID age height class type
# 1 1 34 178 a 1
# 2 2 33 176 b 1
# 3 5 34 166 a 2
# 4 7 35 159 b 3
# 5 43 32 180 b 2
# 6 76 33 178 a 3
它更加简洁。但是,再一次,我也假设你想要一次性展示它们,而不是&#34;展示一个,谈论它,然后展示另一个,谈论它......&#34;。 )
答案 1 :(得分:0)
为什么不通过ID进行merge
?
df_1 <- merge( df1, df2, by='ID')
df_fianl <- merge( df_1, df3, by='ID')
或使用
library(dplyr)
full_join(df1, df2)