Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用`dplyr有条件地改变列值`_R_Dplyr - Fatal编程技术网

使用`dplyr有条件地改变列值`

使用`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

我使用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实现这一点?

这是否满足了您的需求:

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(.)]))