首页 > 解决方案 > 多列的行计算

问题描述

在 R 中是否有可能做到这一点。我正在努力做到这一点。

对于每一行,有 LC1,LC2 等等....定义

Computation need to be done as follows for each row by row:

1. If F1=1, then SSN1=0, SSN2=0, SSN3=0 (If this condition is met then we should directly 
go to next row for computation, we dnt need to check for F2,F3)
     else  F1 not equal 1, then SSN1=SS1


If F1 was not equal 1 then we should proceed below
        Then it should check for if F2=1, then SSN2=0, SSN3=0 (If this condition is met then we should directly 
        go to next row for computation, we dnt need to check for F3)
            else F2 not equal 1 , then SSN2=SS2



If F2 was not equal 1 then we should proceed below
                Then it should check for if F3=1, then SSN3=0
                    else F3 not equal 1 , then SSN3=SS3

输入:

Item    LC1    SS1   F1    LC2   SS2  F2  LC3  SS3   F3
A123    MW1    20    1     SW1   10   2   RM1  10    2
A123    MW1    20    1     WK1   5    4   NA   NA    NA
B123    MW1    15    2     RS1   10   1   RM1  10    2
B123    MW1    15    2     RM1   10   2   RT1  5     1

输出:

Item    LC1    SS1   F1  SSN1   LC2   SS2  F2  SSN2  LC3  SS3   F3  SSN3
A123    MW1    20    1    0     SW1   10   7     0   RM1  10    2    0 
A123    MW1    20    1    0     WK1   5    4     0   NA   NA    NA   0
B123    MW1    15    2   15     RS1   10   1     0   M1   10    2    0
B123    MW1    15    2   15     RM1   10   2    10   RT1  5     1    0

标签: r

解决方案


我目前没有dplyr(升级失败:-(),所以这是一个带有嵌套的 base-R 蛮力实现ifelse

x <- read.table(header=TRUE, stringsAsFactors=FALSE, text="
Item    LC1    SS1   F1    LC2   SS2  F2  LC3  SS3   F3
A123    MW1    20    1     SW1   10   2   RM1  10    2
A123    MW1    20    1     WK1   5    4   NA   NA    NA
B123    MW1    15    2     RS1   10   1   RM1  10    2
B123    MW1    15    2     RM1   10   2   RT1  5     1")

x$SSN1 <- ifelse(x$F1 == 1L, 0, x$SS1)
x$SSN2 <- ifelse(x$F1 == 1L, 0,
                 ifelse(x$F2 == 1L, 0, x$SS2))
x$SSN3 <- ifelse(x$F1 == 1L, 0,
                 ifelse(x$F2 == 1L, 0,
                        ifelse(x$F3 == 1L, 0, x$SS3)))

x
#   Item LC1 SS1 F1 LC2 SS2 F2  LC3 SS3 F3 SSN1 SSN2 SSN3
# 1 A123 MW1  20  1 SW1  10  2  RM1  10  2    0    0    0
# 2 A123 MW1  20  1 WK1   5  4 <NA>  NA NA    0    0    0
# 3 B123 MW1  15  2 RS1  10  1  RM1  10  2   15    0    0
# 4 B123 MW1  15  2 RM1  10  2  RT1   5  1   15   10    0

还有其他几种工作方式,其中大多数更易于阅读。


data.table执行:

library(data.table)
xDT <- copy(x)
setDT(xDT)

xDT[F1 == 1L, c("SSN1", "SSN2", "SSN3") := 0L ]
xDT[(is.na(SSN1)), SSN1 := SS1 ]
xDT[(F2 == 1L & is.na(SSN2)), SSN2 := 0L]
xDT[(is.na(SSN2)), SSN2 := SS2]
xDT[((F2 == 1L | F3 == 1L) & is.na(SSN3)), SSN3 := 0L]
xDT[(is.na(SSN3)), SSN3 := SS3]

xDT
#    Item LC1 SS1 F1 LC2 SS2 F2  LC3 SS3 F3 SSN1 SSN2 SSN3
# 1: A123 MW1  20  1 SW1  10  2  RM1  10  2    0    0    0
# 2: A123 MW1  20  1 WK1   5  4 <NA>  NA NA    0    0    0
# 3: B123 MW1  15  2 RS1  10  1  RM1  10  2   15    0    0
# 4: B123 MW1  15  2 RM1  10  2  RT1   5  1   15   10    0

(必须有更好的方法......我可以让它更容易阅读magrittr::%>%,但是嘘......)


推荐阅读