Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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
基于相应的列r替换列值_R_Tidyverse - Fatal编程技术网

基于相应的列r替换列值

基于相应的列r替换列值,r,tidyverse,R,Tidyverse,我有大约60个不同的列,30个列对应其余30个列的名称。我想基于其他相应的值替换这30列值 样本数据: df.wide可能会将您的数据放在长格式中: library(data.table) setDT(df.wide) dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV")) dt.long[, variable := c("A","B","C")[variable]] title variable IM LV

我有大约60个不同的列,30个列对应其余30个列的名称。我想基于其他相应的值替换这30列值

  • 样本数据:

  • df.wide可能会将您的数据放在长格式中:

    library(data.table)
    setDT(df.wide)
    
    dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV"))
    dt.long[, variable := c("A","B","C")[variable]]
    
        title variable  IM  LV
     1:     A        A 0.5 0.7
     2:     B        A 0.1 0.0
     3:     C        A 4.6 2.5
     4:     D        A 5.6 5.0
     5:     A        B 0.2 1.0
     6:     B        B 0.4 2.0
     7:     C        B 2.6 4.5
     8:     D        B 2.2 5.0
     9:     A        C 2.0 3.0
    10:     B        C 1.0 2.0
    11:     C        C 3.0 5.0
    12:     D        C 4.0 1.0
    
    从这里可以轻松进行编辑:

    dt.long[IM < 2.5, LV := 0]
    
    如果需要相同的列顺序,则需要进一步的步骤:

    setcolorder(res, names(df.wide))
    
       title IM.A LV.A IM.B LV.B IM.C LV.C
    1:     A  0.5  0.0  0.2  0.0    2    0
    2:     B  0.1  0.0  0.4  0.0    1    0
    3:     C  4.6  2.5  2.6  4.5    3    5
    4:     D  5.6  5.0  2.2  0.0    4    1
    
    您可以使用
    ifelse(df.wide$IM.A<2.5,0,df.wide$LV.A)

    假设您的变量以
    df.wide
    中所述的方式隔开(
    IM.x
    LV.x
    都互相跟随),对于所有列,您可以这样做,其中3是第一列
    LV
    ,7是最后一列
    LV

    df.wide[,seq(3,7, by = 2)] <- sapply(seq(3,7, by = 2), function(x)
      ifelse(df.wide[,x-1] < 2.5, 0, df.wide[,x])  
    )
    

    df.wide[,seq(3,7,by=2)]下面是一种使用development
    tidyr
    pivot\uuu
    函数的方法。您可以通过运行
    devtools::install\u github(“tidyverse/tidyr”)
    获得这些信息

    这展示了pivot函数的
    spec
    功能,它允许您灵活地指定重塑格式。其工作方式是规范的每一行都是原始数据帧的输入列(如果使用
    pivot\u longer
    )。
    .name
    列包含输入列名,
    .value
    列包含希望各个输入列中的值进入的新列的名称。在这里,我们希望将以
    “IM”
    开头的列中的所有值放入
    IM
    列中,类似地,对于
    LV
    。最后,我们指定其他变量如何映射到列(这里只是
    letter

    这使我们能够快速地将
    pivot\u加长
    ,使用
    if\u else
    执行所需的替换,然后将
    pivot\u加宽
    恢复到原始格式

    库(tidyverse)
    df.wide%colnames(),
    `.value`=str_extract(`.name`,“^.{2}”),
    letter=str_extract(`.name`,“{1}$”)
    )
    df.wide%>%
    枢轴长度(规格=规格)%>%
    变异(LV=if_else(IM<2.5,0,LV))%>%
    枢轴(规格=规格)
    #>#A tibble:4 x 7
    #>标题IM.A LV.A IM.B LV.B IM.C LV.C
    #>         
    #>1 A 0.50 0.2 0 2 0
    #>2 B 0.1 0 0.4 0 1 0
    #>3 C 4.6 2.5 2.6 4.5 3 5
    #>4 D 5.6 5 2.2 0 4 1
    

    由(v0.3.0)创建于2019-07-23,或通过T/F矩阵编制索引
    df.wide[grep(“LV”,名称(df.wide))][df.wide[grep(“IM”,名称(df.wide))]<2.5]
    
    library(data.table)
    setDT(df.wide)
    
    dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV"))
    dt.long[, variable := c("A","B","C")[variable]]
    
        title variable  IM  LV
     1:     A        A 0.5 0.7
     2:     B        A 0.1 0.0
     3:     C        A 4.6 2.5
     4:     D        A 5.6 5.0
     5:     A        B 0.2 1.0
     6:     B        B 0.4 2.0
     7:     C        B 2.6 4.5
     8:     D        B 2.2 5.0
     9:     A        C 2.0 3.0
    10:     B        C 1.0 2.0
    11:     C        C 3.0 5.0
    12:     D        C 4.0 1.0
    
    dt.long[IM < 2.5, LV := 0]
    
    res = dcast(dt.long, title ~ variable, value.var=c("IM", "LV"), sep=".")
    
       title IM_A IM_B IM_C LV_A LV_B LV_C
    1:     A  0.5  0.2    2  0.0  0.0    0
    2:     B  0.1  0.4    1  0.0  0.0    0
    3:     C  4.6  2.6    3  2.5  4.5    5
    4:     D  5.6  2.2    4  5.0  0.0    1
    
    setcolorder(res, names(df.wide))
    
       title IM.A LV.A IM.B LV.B IM.C LV.C
    1:     A  0.5  0.0  0.2  0.0    2    0
    2:     B  0.1  0.0  0.4  0.0    1    0
    3:     C  4.6  2.5  2.6  4.5    3    5
    4:     D  5.6  5.0  2.2  0.0    4    1
    
    df.wide[,seq(3,7, by = 2)] <- sapply(seq(3,7, by = 2), function(x)
      ifelse(df.wide[,x-1] < 2.5, 0, df.wide[,x])  
    )