有没有办法在R中重新塑造 Dataframe

jq6vz3qz  于 2023-03-15  发布在  其他
关注(0)|答案(5)|浏览(122)

有没有一种方法可以在R .
我有一个 Dataframe df如下

df <- structure(list(values = c("Man", "4", "AIT", "4"), Inputs = c("id_one", 
"idexp_one", "id_zero", "idexp_zero"), Comp = c("one", "one", 
"zero", "zero")), row.names = c(NA, 4L), class = "data.frame")

df
 values     Inputs Comp
1    Man     id_one  one
2      4  idexp_one  one
3    AIT    id_zero zero
4      4 idexp_zero zero

预期产出

Comp    name   Exp 

one      Man    4
zero     AIT    4

有没有办法做到这一点?

new9mtju

new9mtju1#

使用dplyr

library(dplyr) #version >= 1.1.0
df %>%
  reframe(name = first(values), Exp = last(values), .by = Comp)
  Comp name Exp
1  one  Man   4
2 zero  AIT   4
a7qyws3x

a7qyws3x2#

library(dplyr)
group_by(df, Comp) %>% summarize(name=max(values), Exp=min(values))

library(data.table)
setDT(df)[, .(name=max(values), Exp=min(values)), Comp]

输出:

Comp  name  Exp  
  <chr> <chr> <chr>
1 one   Man   4    
2 zero  AIT   4
kknvjkwl

kknvjkwl3#

仅限dplyr的解决方案:

library(dplyr)

df %>% 
  mutate(name = lag(values, default = values[1])) %>% 
  filter(row_number() %% 2 == 0) %>% 
  select(Comp, name, Exp=values)

  Comp name Exp
1  one  Man   4
2 zero  AIT   4
qyswt5oh

qyswt5oh4#

一种可能的方法是:
调用toString以折叠summarise函数中的值列
然后,可以使用seperatetidyr将折叠的列分隔为指定的名称

library(dplyr)
library(tidyr)

df |> 
  group_by(Comp) |> 
  summarise(values = toString(values)) |> 
  separate(values, sep = ", ", into= c("name", "Exp"))
# A tibble: 2 × 3
  Comp  name  Exp  
  <chr> <chr> <chr>
1 one   Man   4    
2 zero  AIT   4
qhhrdooz

qhhrdooz5#

如果手头只有输出,那么很难看出你想用什么方法来改变数据的形状,有多种方法可以得到完全相同的输出,我假设你想根据Input列是否包含字符串“exp”,将values中的值分成两个新的列nameExp

library(tidyverse)

df <- tibble(
    values = c("Man", "4", "AIT", "4"),
    Inputs = c("id_one", "idexp_one", "id_zero", "idexp_zero"),
    Comp = c("one", "one", "zero", "zero")
)

# tidy data
df1 <- df |>
  mutate(type = if_else(str_detect(Inputs, "exp"), "Exp", "name")) |> 
  select(!Inputs)

# reshape wider
df1 |> 
  pivot_wider(names_from = type, values_from = values)
#> # A tibble: 2 × 3
#>   Comp  name  Exp  
#>   <chr> <chr> <chr>
#> 1 one   Man   4    
#> 2 zero  AIT   4

创建于2023年3月11日,使用reprex v2.0.2

相关问题