使用1列中的id减去数据

时间:2016-04-15 18:42:37

标签: 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 = 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)
}   

为什么我没有得到我想要的输出?

2 个答案:

答案 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)