r - 多列的行计算
问题描述
在 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
解决方案
我目前没有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::%>%
,但是嘘......)
推荐阅读
- python - 我如何明确不支持酸洗?
- python - 创建自定义用户时出现Django问题
- kotlin - Room:带有子查询的查询。如何对数据类建模?
- unity3d - Unity 和 Steam VR 启动错误
- c++ - C++:如何获取浮点指针的地址并将其转换为 void**
- mouseevent - Codemirror mouseup 事件
- cv2 - 打开 CV - 无法执行具有 cv2 的 python 代码
- docker - 在 swarm 中运行时无法从私有注册表推/拉
- javascript - 在同一数组中推送数组会导致循环引用
- java - 试图返回数组中元素的位置,打印有问题