首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据名称在表上重复列

根据名称在表上重复列
EN

Stack Overflow用户
提问于 2018-04-26 04:38:29
回答 3查看 98关注 0票数 3

我得到了其中一个Excel史诗的例子。宽表说明了产品对(行)和机器(列中)的容量。该表与下一个可复制示例中的表类似(请注意data.table的使用。欢迎data.frame / tidyverse解决方案,但优先考虑data.table解决方案):

代码语言:javascript
运行
复制
a <- data.table(names = c("product 1", "product 2"), "9-10" = c(1, 5), "21-23" = c(3, 2))

> a
       names 9-10 21-23
1: product 1    1     3
2: product 2    5     2

问题是"9-10“意味着机器9和10具有相同的容量(产品1和2分别为1和5)。我在寻找一种方式来结束一个类似于b的表

代码语言:javascript
运行
复制
> b
       names 9 10 21 23
1: product 1 1  1  3  3
2: product 2 5  5  2  2

我用以下代码实现了它:

代码语言:javascript
运行
复制
for (i in unlist(strsplit(names(a)[2:3], split = "-", fixed = TRUE))){
    a[, print(i) := .SD, .SDcols = grep(paste0(i, "\\b"), names(a)[2:3], value = TRUE)]
}

a[, names(a)[2:3] := NULL]

我想知道有什么更干净的方法可以做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-04-26 05:54:27

data.table的另一种可能性

代码语言:javascript
运行
复制
melt(a, id = 1)[, unlist(tstrsplit(variable,'-')), by = .(names, value)
                ][, dcast(.SD, names ~ V1)]

这意味着:

names 10 21 23 9 1: product 1 1 3 3 1 2: product 2 5 2 2 5

票数 4
EN

Stack Overflow用户

发布于 2018-04-26 05:34:33

使用data.table,我们可以创建一个索引和子集,然后调整名称。

代码语言:javascript
运行
复制
# data
a <- data.table(names = c("product 1", "product 2"),
                "9-10" = c(1, 5),
                "21-23" = c(3, 2))


# names split
name_pos <- strsplit(names(a), split = "-")
# create index for subsetting based on name_pos
index <- rep(seq_along(name_pos), times = lengths(name_pos))

# index and adjust names
a_final <- a[, ..index]
# thanks to Frank for suggestion
setnames(a_final, unlist(name_pos))
票数 4
EN

Stack Overflow用户

发布于 2018-04-26 05:08:03

解决方案之一是将tidyr用作:

代码语言:javascript
运行
复制
library(tidyr)
library(dplyr)
a %>% gather(variable, value, -names) %>% 
  separate(variable, c("col1","col2")) %>% mutate(value2 = value) %>%
  spread(col1, value)  %>% spread(col2, value2) %>%
  group_by(names) %>%
  summarise_all(sum,na.rm = TRUE) %>%
  as.data.frame()
#       names 21 9 10 23
# 1 product 1  3 1  1  3
# 2 product 2  2 5  5  2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50034916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档