在data.table中跳过NA

时间:2017-11-22 21:17:56

标签: r data.table

我想使用data.table,但如果j对应缺失(by),我们会跳过NA部分的计算:

以下是data.table

的示例
library(data.table)
DT <- data.table(y=10, g=c(1,1,1,2,2,2,2,2,NA,NA))

看起来像这样

> DT
     y  g
 1: 10  1
 2: 10  1
 3: 10  1
 4: 10  2
 5: 10  2
 6: 10  2
 7: 10  2
 8: 10  2
 9: 10 NA
10: 10 NA

现在我想在by=上执行g,并且第9行和第10行将被归为一类,因为它们具有相同的值NA

> DT[,.N, by=g]
    g N
1:  1 3
2:  2 5
3: NA 2

我想在输出中保留NA行,但是想要跳过结果中的计算部分,即获取输出,N为空时g为空是} NA

> DT[,.N, by=g]
    g N
1:  1 3
2:  2 5
3: NA NA

我以为我可以通过g访问.GRP的值,但这只会给出组索引而不是值。是否可以使计算以by变量的缺失状态为条件?

1 个答案:

答案 0 :(得分:5)

你可以尝试这个:

    g V1
1:  1  3
2:  2  5
3: NA NA
if ... else ...

它是Henrik's NA^0子句的代数版本。 它使用1返回NA^1NA返回FALSE并且TRUE0可以强制转换为1这一事实和DT[, .(n = .N * NA^is.na(g)), by = g] ,分别为

如果要控制列名:

    g  n
1:  1  3
2:  2  5
3: NA NA
DT[, .N, by = g][is.na(g), N := NA][]

或者,如果上面看起来很棘手,你可以使用data.table链接(感谢Sotos提出这个问题):

N

这将在聚合后更改 #include <bits/stdc++.h> using namespace std; // Function to find the total number of ways to get change of N from // unlimited supply of coins in set S int count(int S[], int n, int N) { // if total is 0, return 1 if (N == 0) return 1; // return 0 if total become negative if (N < 0) return 0; // initialize total number of ways to 0 int res = 0; // do for each coin for (int i = 0; i < n; i++) { // recuse to see if total can be reached by including // current coin S[i] res += count(S, n, N - S[i]); } // return total number of ways return res; } // main function int main() { // n coins of given denominations int S[] = { 1, 2, 3 }; int n = sizeof(S) / sizeof(S[0]); // Total Change required int N = 4; cout << "Total number of ways to get desired change is " << count(S, n, N); return 0; } 的值。