R 使用1列中的id减去数据
我有3个数据集。它们都有一列名为R 使用1列中的id减去数据,r,R,我有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
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)
}
清单为什么不按id进行合并
df_1 <- merge( df1, df2, by='ID')
df_fianl <- merge( df_1, df3, by='ID')
这是一个黑客。如果您想/需要导出到word文档,我强烈建议您使用类似R标记(例如)的方法使用knitr
(以及在幕后)。例如,我鼓励您研究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")
}
}
}
(就我个人而言,我无法想象以这种格式提供输出,但我不知道您的喜好或用例。有许多其他方式可以显示这样的数据。例如:
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
它更简洁。但是,再一次,我也假设您希望同时显示它们,而不是“显示一个,谈论它,然后显示另一个,谈论它…”。尝试合并(合并(合并(df1,df2,by=“ID”)、df3,by=“ID”)
?从这里开始,它只是一个data.frame。(您也可以使用dplyr::left_join
和family。)@r2evans merge可以解决3个数据集的问题。如果我有大于20的数据集,我就不能那样做。此外,merge()无法提供我想要的格式:(@PNY你没有提供R格式,你只是展示了它的外观。你的问题是“我有3个数据集”,所以我提供了3个数据集的解决方案是否奇怪/错误?好的,它们都是如何存储的,类似于Reduce(function(x,y)merge(x,y,by=“ID”)之类的东西(df1,df2,df3,…,df42))
提供一些更容易接受的东西?从这里开始,打印您想要的格式应该很简单。n
定义在哪里?为什么要将ID
与字符串'i'
而不是i
的值进行比较?为什么打印后返回数据
?您将如何调用列表
?你期望什么?你得到了什么?你的函数与输出完全不同。@r2evans很抱歉这个问题不清楚。我希望有一个脚本,以后每当我有3个以上的数据集时,我就能够解决这个问题。当我使用“合并”时,将所有数据集合并在一起,而我希望它们分开。一个当每个数据集都有30多列时,可能会出现问题。然后,当我们使用merge()时,输出将花费一英里的时间。哈哈。我不太确定我是否使用了正确的函数,这就是为什么我没有得到预期的输出(输出的布局在我的问题中。merge可以解决3个数据集的问题。如果我有like>20个数据集,我就不能这样做。而且merge()不能给我想要的格式:(我想把每个ID分别列为上面的布局:)然后,您可能需要创建df as列表。并通过列表解析您提供的输出格式不是R格式的输出。但是,我仍然相信,将它们合并为数据帧或列表可以让您更好地控制任何操作的数据。幸运的是,我正试图使用R2wd包将它们导出为doc.file。但是这是另一个故事>。这超出了我的预期。感谢您数百万次。但我正在尝试学习如何使用R-Markdown。R2wd包对我来说太复杂了:(.再次感谢mil:)通过“它发出了NULL
”,您的意思是它返回了NULL
,还是它将NULL
放在控制台输出上?是的,它返回了NULL。我为糟糕的英语道歉:4年来没有更新,更多的理由是考虑学习RMARKDOWN。我上面给出的网站值得一看,虽然我知道它不一定能解决所有问题。只需修改代码来捕获字符串,而不是把它提交给<代码> CAT/COM>;用<代码> SUple(IDS,函数(ID))替换<<代码> < /Calp>循环。{…})
甚至粘贴(sapply(id,function(id){…}),collapse=“\n”)
应该做你想做的事情。
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