Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用1列中的id减去数据_R - Fatal编程技术网

R 使用1列中的id减去数据

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

我有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)
}   

清单为什么不按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