R 根据条件在数据帧中收集多列

R 根据条件在数据帧中收集多列,r,dplyr,R,Dplyr,我有一个宽格式的大数据集(一百万行~300列)。 数据集包含多种产品的不同指标,如收入、成本等。不幸的是,数据集的格式很宽。因此,收入或成本等变量不是一列。相反,每个产品的收入/成本等都有一列 例如,这些列被称为“product1\u收入”、“product2\u收入”、“product1\u成本”、“product2\u成本”等等 我想将数据集转换为长格式,以便能够正确地使用它 我可以实现一个变量“总收入”的转换。这是可行的(除了我不能保留id这一事实),但我想对所有其他指标也这样做 se

我有一个宽格式的大数据集(一百万行~300列)。 数据集包含多种产品的不同指标,如收入、成本等。不幸的是,数据集的格式很宽。因此,收入或成本等变量不是一列。相反,每个产品的收入/成本等都有一列

例如,这些列被称为“product1\u收入”、“product2\u收入”、“product1\u成本”、“product2\u成本”等等

我想将数据集转换为长格式,以便能够正确地使用它

我可以实现一个变量“总收入”的转换。这是可行的(除了我不能保留id这一事实),但我想对所有其他指标也这样做

  select(ends_with("_total_revenue")) %>%
  gather(key=product,value="total_revenue") %>%
  mutate(product=str_replace(product,"_total_revenue",""))

### Trying to keep the IDs does not work:
dataset %>%
  select(ends_with("_total_revenue"),id) %>%
  gather(key=product,value="total_revenue") %>%
  mutate(product=str_replace(product,"_total_revenue",""))

### I want something like this (if it would work of course)

i<-c("_total_revenue","_total_cost")
for(ends_with(colnames(dataset),i) in i) 
{
dataset %>%
  select(ends_with(!!i),id) %>%
  gather(key=product,value=!!i) %>%
  mutate(product=str_replace(product,!!i,""))
  print(i)
}
select(以(“\u总收入”)结尾)%>%
聚集(关键=产品,value=“总收入”)%>%
变异(产品=str\u替换(产品,“\u总收入,”))
###试图保留ID不起作用:
数据集%>%
选择(以(“\u总收入”)结束),id]>%
聚集(关键=产品,value=“总收入”)%>%
变异(产品=str\u替换(产品,“\u总收入,”))
###我想要这样的东西(当然,如果它能工作的话)
i%
选择(以(!!i)结尾,id)%>%
聚集(键=产品,值=!!i)%>%
突变(产品=str_替换(产品,!!i,“”)
印刷品(一)
}

假设您有如下数据:

df <- data.frame(id = 1:5, product1_cost  = 11:15, product2_cost = 16:20, 
                 product1_revenue = 21:25, product2_revenue = 26:30)
df
#  id product1_cost product2_cost product1_revenue product2_revenue
#1  1            11            16               21               26
#2  2            12            17               22               27
#3  3            13            18               23               28
#4  4            14            19               24               29
#5  5            15            20               25               30

假设您有这样的数据:

df <- data.frame(id = 1:5, product1_cost  = 11:15, product2_cost = 16:20, 
                 product1_revenue = 21:25, product2_revenue = 26:30)
df
#  id product1_cost product2_cost product1_revenue product2_revenue
#1  1            11            16               21               26
#2  2            12            17               22               27
#3  3            13            18               23               28
#4  4            14            19               24               29
#5  5            15            20               25               30

嗨@ronak shah,谢谢你的快速回答。运行代码会导致以下错误消息:错误:每行输出必须由唯一的键组合标识。这似乎是一个相当普遍的问题?@KevinR是的,但解决方案取决于数据的结构。我的猜测是尝试
df%%>%gather(key,value,-id)%%>%sep=“”)%%>%groupby(id)%%>%mutate(row=row_number())%%>%spread(key,value)
Hi@ronak shah,这似乎有效。但我不明白的是,我收到了很多运行此代码的NAs。我检查了NAs,数据集不包含任何缺少的值。@如果某些级别的值不相等,则数据中可能存在KevinR
NA
s。您是否检查了值是否正确转换为长格式或存在一些不匹配?实际上,其他问题的链接和给出的答案解决了我的问题Hi@ronak shah,感谢您的快速回答。运行代码会导致以下错误消息:错误:每行输出必须由唯一的键组合标识。这似乎是一个相当普遍的问题?@KevinR是的,但解决方案取决于数据的结构。我的猜测是尝试
df%%>%gather(key,value,-id)%%>%sep=“”)%%>%groupby(id)%%>%mutate(row=row_number())%%>%spread(key,value)
Hi@ronak shah,这似乎有效。但我不明白的是,我收到了很多运行此代码的NAs。我检查了NAs,数据集不包含任何缺少的值。@如果某些级别的值不相等,则数据中可能存在KevinR
NA
s。您是否检查了值是否正确转换为长格式,或者是否存在一些不匹配?实际上,指向另一个问题的链接和给出的答案解决了我的问题