我有一个需要转换的数据帧.我需要根据列的值将唯一行更改为单列.

我的数据如下:

df1 <- data.frame(V1 = c("a", "a", "b", "b","b"), 
                  V2 = c("product1", "transport", "product1", "product2","transport"),
                  V3 = c("100", "10", "100", "100","10"))

> df1
  V1        V2  V3
1  a  product1 100
2  a transport  10
3  b  product1 100
4  b  product2 100
5  b transport  10

我需要进行以下转换,并将V3的值划分为V1中包含的产品数量.

> df2
  V1       V2 transport  V3
1  a product1        10 100
2  b product1         5 100
3  b product2         5 100

推荐答案

这里有一个方法是data.table-转换为data.table(setDT),确保"V3"是numeric(对于除法-它被创建为字符),按"V1"分组,通过提取"V3"值创建"传输",其中"V2"是"传输",除以"V2"中非"传输"的元素数,然后通过从"V2"中删除"传输"元素来子集数据

library(data.table)
df1$V3 <- as.numeric(df1$V3)
setDT(df1)[, transport := V3[V2 == "transport"]/
       sum(V2 != "transport"), by = V1]
df1[V2 != "transport"]
       V1       V2    V3 transport
   <char>   <char> <num>     <num>
1:      a product1   100        10
2:      b product1   100         5
3:      b product2   100         5

或者另一个dplyr/tidyr的选项

library(dplyr)
library(tidyr)
df1 %>%
   type.convert(as.is = TRUE) %>% 
   mutate(transport = case_when(V2 == 'transport' ~ V3)) %>% 
   group_by(V1) %>%
   fill(transport, .direction = "downup") %>%
   mutate(transport = transport/sum(V2 != "transport")) %>% 
   ungroup %>% 
   filter(V2 != "transport")
# A tibble: 3 × 4
  V1    V2          V3 transport
  <chr> <chr>    <int>     <dbl>
1 a     product1   100        10
2 b     product1   100         5
3 b     product2   100         5

R相关问答推荐

for循环和if else在R中

R -创建一列,指示另一列是否具有相同的值

如何设置搜索栏来搜索整个Shiny应用程序页面?

r带有参考年的两年移动平均线

了解.groups的目的= dØr的摘要功能中的删除

DT::可数据的正规表达OR运算符问题

R等效于LABpascal(n,1)不同的列符号

根据R中两个变量的两个条件删除带有dspirr的行

在for循环中转换rabrame

计算具有奇数日期的运行金额

错误:非常长的R行中出现意外符号

如何编辑gMarginal背景以匹配绘图背景?

如何对2个列表元素的所有组合进行操作?

如何在R中使用hmm TMB提前一步预测观察到的状态?

使用R将简单的JSON解析为嵌套框架

Geom_arcbar()中出错:找不到函数";geom_arcbar";

`-`是否也用于数据帧,有时使用引用调用?

SHILINY中DT列的条件着色

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

替换在以前工作的代码中有x行&q;错误(geom_sf/gganimate/dow_mark)