r - 有条件地将 mutate_at 应用于 R 中数据帧中的特定行

标签 r if-statement dplyr conditional-statements tidyverse

我在 R 中有一个数据框,如下所示:

a  b  c  condition
1  4  2  acap
2  3  1  acap
2  4  3  acap
5  6  8  ncap
5  7  6  ncap
8  7  6  ncap

我正在尝试为条件 ncap(以及此处未显示的其他 2 个条件)重新编码 a、b 和 c 列中的值,同时单独保留 acap 的值。

以下代码适用于前 3 列。我试图弄清楚如何将它仅应用于我按条件指定的行,同时将所有内容保留在同一数据框中。
df = df %>%
     mutate_at(vars(a:c), function(x) 
     case_when x == 5 ~ 1, x == 6 ~ 2, x == 7 ~ 3, x == 8 ~ 4)

这是预期的输出。
a  b  c  condition
1  4  2  acap
2  3  1  acap
2  4  3  acap
1  2  4  ncap
1  3  2  ncap
4  3  2  ncap

我四处寻找这个问题的答案,但找不到。如果有人知道已经存在的答案,我会很感激被引导到它。

最佳答案

我们可以使用 case_when在使用 row_number 创建的条件下即如果行号是 4 到 6,则从值中减去 4 否则返回值

df %>% 
   mutate_at(vars(a:c), funs(case_when(row_number() %in% 4:6 ~ . - 4L, 
                                       TRUE ~ .)))
#  a b c condition
#1 1 4 2      acap
#2 2 3 1      acap
#3 2 4 3      acap
#4 1 2 4      ncap
#5 1 3 2      ncap
#6 4 3 2      ncap

如果这是基于值而不是行,则在值上创建条件
df %>% 
   mutate_at(vars(a:c), funs(case_when(. %in% 5:8 ~ . - 4L, 
                                       TRUE ~ .)))
#  a b c condition
#1 1 4 2      acap
#2 2 3 1      acap
#3 2 4 3      acap
#4 1 2 4      ncap
#5 1 3 2      ncap
#6 4 3 2      ncap

或者,如果它基于“条件”中的值
df %>% 
   mutate_at(vars(a:c), funs(case_when(condition == 'ncap' ~ . - 4L, 
                                       TRUE ~ .)))

或者不使用任何 case_when
df %>% 
  mutate_at(vars(a:c), funs( . - c(0, 4)[(condition == 'ncap')+1]))
#  a b c condition
#1 1 4 2      acap
#2 2 3 1      acap
#3 2 4 3      acap
#4 1 2 4      ncap
#5 1 3 2      ncap
#6 4 3 2      ncap

base R ,我们可以通过创建索引来做到这一点
i1 <- df$condition =='ncap'
df[i1, 1:3] <- df[i1, 1:3] - 4

数据
df <- structure(list(a = c(1L, 2L, 2L, 5L, 5L, 8L), b = c(4L, 3L, 4L, 
 6L, 7L, 7L), c = c(2L, 1L, 3L, 8L, 6L, 6L), condition = c("acap", 
 "acap", "acap", "ncap", "ncap", "ncap")), class = "data.frame", 
 row.names = c(NA, -6L))

关于r - 有条件地将 mutate_at 应用于 R 中数据帧中的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51940709/

相关文章:

r - 基于多个条件创建输出

r - 将百分比标签添加到堆积条形图ggplot2

c - 在 if 语句中无法重新分配内存

if-statement - 将数据从多列转换为行并保留 "labels"

r - 如何删除百分号并使用 r 查找列中某些值的平均值?

r - 按不同的降序排列数字

r - 表函数不适用于具有日期类的日期 - R

r - 这些是字符串还是变量?

r - 尝试设置 Knit 'document' 输出 Hook 会导致代码块换行符丢失

R - 如何将循环转换为 R 中的函数