如何仅使用目标列的一个值来使用Spread函数?

问题描述 投票:1回答:3

我们具有以下数据框a,如下所示:


 > a
    google_prod      Value
1     categoria          ML
2        google         120
3       youtube          24
4     categoria          AO
5        google           2
6       youtube           0
7     categoria          ML
8        google          27
9       youtube           0
10    categoria          AO
11       google           5
12      youtube           0

我们希望得到这个:

    categoria google_prod    Value
1          ML   google        120
2          ML   youtube        24
3          AO   google          2
4          AO   youtube         0      
5          ML   google         27
6          ML   youtube         0    
7          AO   google          5
8          AO    youtube        0    

换句话说,执行Spread或类似函数的一种应用程序,其中仅从google_prod列中获取一个值来应用它,在这种情况下,它将是'categoria'值。

r tidy spread
3个回答
1
投票
library(tidyverse)

# getting the data
category <- rep(c("categoria",  "google",   "youtube"), 4)
value <- c("ML", "120", "24",   "AO",   "2",    "0",    "ML",   "27",   "0",    "AO",   "5",    "0")

df <- tibble(category, value)

df %>%
  mutate(helper = rep(1:(nrow(df)/3), each = 3)) %>%
  pivot_wider(names_from = category, values_from = value) %>%
  select(-helper) %>%
  pivot_longer(names_to = "google_prod",  values_to = "values", -1)

# # A tibble: 8 x 3
# categoria google_prod values
# <chr>     <chr>       <chr> 
# 1 ML        google      120   
# 2 ML        youtube     24    
# 3 AO        google      2     
# 4 AO        youtube     0     
# 5 ML        google      27    
# 6 ML        youtube     0     
# 7 AO        google      5 
# 8 AO        youtube     0 

0
投票

一个想法如下。据我所知,您所定位的值在Value中包含两个大写字母。我搜索了他们在使用grep()的位置并获得了索引。使用此信息,我使用findIntervals()创建了一个组变量。对于每个组,我汇总了数据;我提取并将大写字母值放在categoria中。以类似的方式,我又创建了两个列。它们是列表。所以我最后使用unnest()来获取输出。

library(tidyverse)

ind <- grep(x = mydf$Value, pattern = "[A-Z]+")

group_by(mydf, group = findInterval(x = 1:n(), vec = ind)) %>%
summarize(categoria = Value[google_prod == "categoria"],
          Google_prod = list(google_prod[google_prod != "categoria"]),
          Value = list(Value[google_prod != "categoria"])) %>% 
unnest(cols = Google_prod:Value)

  group categoria Google_prod Value
  <int> <chr>     <chr>       <chr>
1     1 ML        google      120  
2     1 ML        youtube     24   
3     2 AO        google      2    
4     2 AO        youtube     0    
5     3 ML        google      27   
6     3 ML        youtube     0    
7     4 AO        google      5    
8     4 AO        youtube     0    

DATA

mydf <- structure(list(google_prod = c("categoria", "google", "youtube", 
"categoria", "google", "youtube", "categoria", "google", "youtube", 
"categoria", "google", "youtube"), Value = c("ML", "120", "24", 
"AO", "2", "0", "ML", "27", "0", "AO", "5", "0")), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

0
投票

另一个选项:

library(dplyr)

a <- mutate(a, idx = cumsum(grepl('[[:alpha:]]', Value)))

a %>% 
  filter(grepl('[[:alpha:]]', value)) %>%
  select(idx, categoria = Value) %>%
  left_join(filter(a, !grepl('[[:alpha:]]', value)), by = 'idx') %>%
  select(-idx)

输出:

  categoria google_prod Value
1        ML      google   120
2        ML     youtube    24
3        AO      google     2
4        AO     youtube     0
5        ML      google    27
6        ML     youtube     0
7        AO      google     5
8        AO     youtube     0
© www.soinside.com 2019 - 2024. All rights reserved.