我有这个格式的 Big Data 集.我想 a)在x1和x10之间的任何地方用以下值序列1—1—1—1标识那些ID/行;以及>> b)生成标识序列开始的新变量("事件"),取值X1,...,X10

my_df <- data.frame(ID = c("a","b","c","d","e","f","g","h"),
                    replicate(8,sample(1:4,8,rep=TRUE)))

对于a),我用2替换值1,然后粘贴值从X1到X10,然后过滤序列1—1—2—2.>对于b),我使用嵌套的ifelse()创建了变量"event",以标识序列的开始位置.它只适用于8列. 是否有一种方法可以提高具有更多列的数据集的效率?

我非常感谢任何指示!

df_seq <- my_df%>%
  mutate_at(vars(starts_with('X')), funs(ifelse(. > 1, 2, .)))%>%
  mutate(seq = paste(X1,"-",X2,"-",X3,"-",X4,"-",X5,"-",X6,"-",X7,"-",X8))%>%
  filter(grepl("1 - 1 - 2 - 2", seq))%>%
  mutate(event = ifelse(X1 == 1 & X2 == 1 & X3 == 2 & X4 == 2,"X1",
                 ifelse(X2 == 1 & X3 == 1 & X4 == 2 & X5 == 2,"X2",
                 ifelse(X3 == 1 & X4 == 1 & X5 == 2 & X6 == 2,"X3",
                 ifelse(X4 == 1 & X5 == 1 & X6 == 2 & X7 == 2,"X4","X5")))))

推荐答案

例如,您可以使用regexpr捕获连续1的第一次出现,后面是大于1的值

set.seed(0)
my_df %>%
    mutate(event = regexpr("1{2}[^1]{2}", do.call(paste0, select(., -ID)))) %>%
    mutate(event = ifelse(event > 0, paste0("X", event), NA))

  ID X1 X2 X3 X4 X5 X6 X7 X8 event
1  a  2  3  2  1  2  2  4  3  <NA>
2  b  1  2  2  1  1  2  1  4  <NA>
3  c  4  2  2  1  4  2  3  2  <NA>
4  d  3  3  2  2  3  3  2  2  <NA>
5  e  1  3  3  1  1  4  1  3  <NA>
6  f  2  1  1  1  4  4  4  3    X3
7  g  1  1  3  2  3  4  4  2    X1
8  h  3  1  1  2  2  2  1  2    X2

R相关问答推荐

在ggplot的注释表格中突出显示最大值

在通过最大似然估计将ODE模型与数据匹配时,为什么要匹配实际参数的转换值?

R Highcharts与两个位置关联的注释

如何在R中添加截止点到ROC曲线图?

如何动态更新selectizeInput?

根据多个条件增加y轴高度以适应geom_text标签

删除具有相同标题的tabPanel(shinly)

从BRM预测价值

将饼图插入条形图

如何同时从多个列表中获取名字?

R:从geom_ol()中删除轮廓并导出为pdf

将Posict转换为数字时的负时间(以秒为单位)

计算两列中满足特定条件连续行之间的平均值

以NA为通配符的R中的FULL_JOIN以匹配其他数据中的任何值.Frame

安全地测试文件是否通过R打开

计算使一组输入值最小化的a、b和c的值

带RStatix的Wilcoxon环内检验

快速合并R内的值

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

如何将两个用不同的运算符替换*的矩阵相乘