使用`dplyr有条件地改变列值`
我使用WRS2进行稳健的成对比较。但一个问题是,它从输出数据帧中删除了组级名称,并将其保存在另一个对象中 设置 第123集 图书馆WRS2 图书馆管理员 稳健成对比较 x组psihat ci.下限ci.上限p.值 > [1,] 1 2 -1.0 -3.440879 1.44087853 0.25984505 > [2,] 1 3 -2.8 -5.536161 -0.06383861 0.04914871 > [3,] 2 3 -1.8 -4.536161 0.93616139 0.17288911 具有组级名称的向量 x$fnames >[1]安慰剂低-高 我可以将其转换为TIBLE: 转换为TIBLE suppressMessagesas\u tibblex$comp、.name\u repair=unique%>% dplyr::重命名组1=组…1,组2=组…2 >一个tibble:3x6 >第1组第2组psihat ci.lower ci.upper p.value > > 1 1 2 -1 -3.44 1.44 0.260 > 2 1 3 -2.8 -5.54 -0.0638 0.0491 > 3 2 3 -1.8 -4.54 0.936 0.173 然后,我想用fnames中包含的实际名称替换组列数值,以便映射fnames[1]->1、fnames[2]->2,依此类推 因此,最终的数据帧应该如下所示- >一个tibble:3x6 >第1组第2组psihat ci.lower ci.upper p.value > >1安慰剂低-1-3.44 1.44 0.260 >2安慰剂高-2.8-5.54-0.0638 0.0491 >3低-高-1.8-4.54 0.936 0.173使用`dplyr有条件地改变列值`,r,dplyr,R,Dplyr,我使用WRS2进行稳健的成对比较。但一个问题是,它从输出数据帧中删除了组级名称,并将其保存在另一个对象中 设置 第123集 图书馆WRS2 图书馆管理员 稳健成对比较 x组psihat ci.下限ci.上限p.值 > [1,] 1 2 -1.0 -3.440879 1.44087853 0.25984505 > [2,] 1 3 -2.8 -5.536161 -0.06383861 0.04914871 > [3,] 2 3 -1.8
在本例中,复制粘贴这三个值很容易,但我想采用一种可推广的方法,无论级别多少,都可以使用。我如何使用dplyr实现这一点?这是否满足了您的需求:
names <- c("A","B","C")
df = data.frame(group=c(1,2,3))
library(dplyr)
df %>% mutate(group = names[group])
group
1 A
2 B
3 C
尝试这种tidyverse方法,在将对象提取为Tibble后很久将数据格式化。您可以使用left_join获得您想要的组。下面是获得接近您想要的东西的代码:
# setup
set.seed(123)
library(WRS2)
library(tidyverse)
# robust pairwise comparisons
x <- lincon(libido ~ dose, data = viagra, tr = 0.1)
#Transform to tibble
df1 <- suppressMessages(as_tibble(x$comp, .name_repair = "unique")) %>%
dplyr::rename(group1 = Group...1, group2 = Group...2)
#Extract labels
df2 <- tibble(treat=x$fnames) %>% mutate(value=1:n())
#Format to long df1
df1 <- df1 %>%
mutate(id=1:n()) %>%
pivot_longer(cols = c(group1,group2)) %>%
rename(group=name) %>% left_join(df2) %>% select(-value) %>%
pivot_wider(names_from = group,values_from=treat) %>% select(-id)
输出:
# A tibble: 3 x 6
psihat ci.lower ci.upper p.value group1 group2
<dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 -1 -3.44 1.44 0.260 placebo low
2 -2.8 -5.54 -0.0638 0.0491 placebo high
3 -1.8 -4.54 0.936 0.173 low high
x.comp
#> # A tibble: 3 x 6
#> Group Group.1 psihat ci.lower ci.upper p.value
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 placebo low -1 -3.44 1.44 0.260
#> 2 placebo high -2.8 -5.54 -0.0638 0.0491
#> 3 low high -1.8 -4.54 0.936 0.173
下面是一种使用recode函数的方法,通过编程方式从数据构建recoding向量:
# Setup
set.seed(123)
library(WRS2)
library(tidyverse)
x <- lincon(libido ~ dose, data = viagra, tr = 0.1)
# Create recoding vector
recode.vec = x$fnames %>% set_names(1:length(x$fnames))
# Recode columns
x.comp = x$comp %>%
as_tibble(.name_repair=make.unique) %>%
mutate(across(starts_with("Group"), ~recode(., !!!recode.vec)))
输出:
# A tibble: 3 x 6
psihat ci.lower ci.upper p.value group1 group2
<dbl> <dbl> <dbl> <dbl> <chr> <chr>
1 -1 -3.44 1.44 0.260 placebo low
2 -2.8 -5.54 -0.0638 0.0491 placebo high
3 -1.8 -4.54 0.936 0.173 low high
x.comp
#> # A tibble: 3 x 6
#> Group Group.1 psihat ci.lower ci.upper p.value
#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#> 1 placebo low -1 -3.44 1.44 0.260
#> 2 placebo high -2.8 -5.54 -0.0638 0.0491
#> 3 low high -1.8 -4.54 0.936 0.173
使用命名向量与tidyverse匹配。这是按值匹配,而不是按索引的顺序匹配,即如果“Group”列中的值不在序列或字符中,这仍然有效
library(dplyr)
as_tibble(x$comp, .name_repair = 'unique') %>%
mutate(across(starts_with("Group"),
~ setNames(x$fnames, seq_along(x$fnames))[as.character(.)]))