我想对指定的列执行rowSums().我的问题是,每一行需要求和的列是不同的,并且由另一个变量给出.其动机是判断给定列之前的三个值是否为NA.

可以通过以下方式构建示例数据框

toy <- data.frame(id = c(rep(1, 10), rep(2, 10), rep(3, 10)),
                  day = c(1:10, 1:10, 1:10),
                  response = c(1, NA, NA, NA, 1, 1, 1, NA, NA, 1,
                          1, 1, NA, 1 ,1 ,1 ,1 ,1 ,1, 1,
                          NA, 1, NA, 1, 1, 1, NA, NA, NA, NA),
                  colnum = c(rep(5, 10), rep(7, 10), rep(10, 10)))
toy <- toy %>% pivot_wider(names_from = 2, values_from = 3, names_prefix = "day")
toy

在本例中,变量colnum给出了要判断前三天的日期.从数据来看,

toy
# A tibble: 3 x 12
     id colnum  day1  day2  day3  day4  day5  day6  day7  day8  day9 day10
  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1     1      5     1    NA    NA    NA     1     1     1    NA    NA     1
2     2      7     1     1    NA     1     1     1     1     1     1     1
3     3     10    NA     1    NA     1     1     1    NA    NA    NA    NA

我想在数据框中创建一个新列,其中ID 1、2和3的值分别为FALSETRUEFALSE.我们就叫它three_miss吧.例如,对于id=1,我们想判断第2天到第4天是否都是NA,因为colnum=5. 我try 了一个简单的rowSums()实现

 toy <- toy %>% mutate(three_miss = rowSums(select(., (colnum-1):(colnum+1)), na.rm = TRUE) == 3)

使用colnum-1:colnum+1是根据我们需要的列号推断出来的.代码将运行,但three_miss的所有值都为FALSE,这不是正确或所需的输出.我收到警告消息:

There were 2 warnings in `mutate()`.
The first warning was:
i In argument: `three_miss = ==...`.
Caused by warning in `x:y`:
! numerical expression has 3 elements: only the first used

我从这里得到的感觉是,要么是select()导致了问题,要么是rowSums()每行产生了多个总和.我试着添加了group_by(id),但没有帮助.我希望停留在管道的环境中,但如果这不可能,我对其他解决方案持开放态度.

附注:我知道如果colnum小于4或大于10可能会有问题.我正计划使用case_when()来修正这一点.例如,

toy <- toy %>% mutate(three_miss =
  case_when(
    colnum <=3 ~ NA,
    colnum > 10 ~ NA,
    TRUE ~ code_that_works
  )
)

推荐答案

如果旋转前的数据为toy0,则可以

toy0 %>%
  filter(between(day, colnum-3, colnum-1)) %>%
  summarize(three_wise = all(!is.na(response)), .by = id) %>%
  left_join(toy, ., by = "id")
# # A tibble: 3 × 13
#      id colnum  day1  day2  day3  day4  day5  day6  day7  day8  day9 day10 three_wise
#   <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <lgl>     
# 1     1      5     1    NA    NA    NA     1     1     1    NA    NA     1 FALSE     
# 2     2      7     1     1    NA     1     1     1     1     1     1     1 TRUE      
# 3     3     10    NA     1    NA     1     1     1    NA    NA    NA    NA FALSE     

R相关问答推荐

提取rame中对应r中某个变量的n个最小正值和n个最大负值的条目

R Lubridate:舍入/快照日期时间到一天中最近的任意时间?

如何删除多个.CSV文件的行

更改编号列表的 colored颜色

在使用ggroove后,将图例合并在gplot中

筛选出以特定顺序患病的个体

Select 季度月值

如何在PackageStatus()中列出&q;不可用的包&q;?

将选定的索引范围与阈值进行比较

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

如何将Which()函数用于管道%>;%

如何使用For-R循环在向量中找到一系列数字

如何将这个小列表转换为数据帧?

R中治疗序列的相对时间指数

网络抓取新闻标题和时间

Ggplot2如何找到存储在对象中的残差和拟合值?

R将函数参数传递给ggploy

roxygen2正在处理太多的文件

reshape 数据帧-基于组将行转换为列

通过分析特定列中的字符串在数据框中创建新的行和列