【问题标题】:Data frame arrange/rearrange and removing duplicate columns数据框排列/重新排列和删除重复列
【发布时间】:2017-08-03 22:17:25
【问题描述】:

R 数据集

x <- data.frame(term = c("A", "B", "C"))
x$points <- list(
  data.frame(title=c("Iliad", "Odyssey"), value=c(-1194, -800)),
  data.frame(title=c("Iliad", "Odyssey"), value=c(-44, -29)),
  data.frame(title=c("Iliad", "Odyssey"), value=c(55, -700))
)

cat(toJSON(x, pretty=TRUE))

需要结果

title          A(value)     B(value)     C(value)    
Iliad           -1194           -44          55
Odyssey         -800            -29         -700

任何人都可以帮助我获得所需的结果

【问题讨论】:

  • 不错的可重现示例!我会鼓励你下次也尝试用文字描述你想做什么。
  • 您正在寻找加入三个数据框。

标签: r join dataframe duplicates


【解决方案1】:
library(tidyr)
unnest(x, points) %>%
    spread(key = term, value = value)
#     title     A   B    C
# 1   Iliad -1194 -44   55
# 2 Odyssey  -800 -29 -700

当然,您可以将"(value)" 字符串添加到带有paste 的列名中。我会把它留给你(虽然我认为在列名中包含括号是个坏主意)。

【讨论】:

  • 感谢 Gregor 的解决方案和快速响应
【解决方案2】:

类似的东西也应该在base R 中工作:

cbind.data.frame(title=x$points[[1]][,1], 
         do.call(cbind, lapply(1:length(x$term), 
                        function(i) setNames(data.frame(x$points[[i]][,2]), x$term[i]))))

#    title     A   B    C
#1   Iliad -1194 -44   55
#2 Odyssey  -800 -29 -700

【讨论】:

    【解决方案3】:

    这是一个base R 选项,带有mergeReduce

    setNames(Reduce(function(...) merge(..., by = 'title'), x$points), 
                             c('title', as.character(x$term)))
    #    title     A   B    C
    #1   Iliad -1194 -44   55
    #2 Odyssey  -800 -29 -700
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2019-09-18
      相关资源
      最近更新 更多