在data.table条件为nrow时使用lapply更新值

时间:2015-10-16 10:37:03

标签: r data.table lapply

我想将data.table中的列的值更新为同一个表中的另外两列。

此代码在某种程度上有效,但我想更新DT中的值而不是返回DT列表。

可重现的例子:

library(data.table)
library(gtools)

# Create Data Table
  DT <- as.data.table(combinations(3,2,1:3,repeats=TRUE))
  DT[, V3 := 9999 ]

DT
>   V1 V2   V3
>1:  1  1 9999
>2:  1  2 9999
>3:  1  3 9999
>4:  2  2 9999
>5:  2  3 9999
>6:  3  3 9999

我的代码:

# create function

stationary <- function(i) {DT[i, V3 := if (V1==V2) 0  else  V1+V2 ]}

i <- 1:nrow(DT)

DT <- lapply(i, stationary)  # This returns a list of identical data tables

我想要的结果:

DT
>   V1 V2 V3
>1:  1  1  0
>2:  1  2  3
>3:  1  3  4
>4:  2  2  0
>5:  2  3  5
>6:  3  3  0

2 个答案:

答案 0 :(得分:5)

我会这样做:

DT[, V3 := (V1 + V2) * (V1 != V2)]
#   V1 V2 V3
#1:  1  1  0
#2:  1  2  3
#3:  1  3  4
#4:  2  2  0
#5:  2  3  5
#6:  3  3  0

快速而简单。

答案 1 :(得分:2)

您可以使用链接:

 var _l2approvaluserid = this.travelContext.EmployeeReportingLevels.Where(e => e.userId == personalother.FirstOrDefault(x => x.gpersonal.id == personalother.Key).gpersonal.createdBy).FirstOrDefault().level2;
 personalviewdetail = new PersonalRequestDisplayModel
   {
     ....
     l2approvaluserid = _l2approvaluserid;
     ....
     l2Name = this.travelContext.Employees.Where(emp => emp.userId == _l2approvaluserid).FirstOrDefault().firstName,

  }                     

如果您坚持使用整数,则可以避免library(data.table) library(gtools) # combinations() DT <- as.data.table(combinations(3,2,1:3,repeats=TRUE)) DT[, V3 := 9999 ] DT[V1==V2, V3 := 0 ][V1!=V2, V3 := as.numeric(V1+V2) ][] # V1 V2 V3 # 1: 1 1 0 # 2: 1 2 3 # 3: 1 3 4 # 4: 2 2 0 # 5: 2 3 5 # 6: 3 3 0 来电,因此as.numericV3 := 9999L