我想使用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
变量的缺失状态为条件?
答案 0 :(得分:5)
你可以尝试这个:
g V1
1: 1 3
2: 2 5
3: NA NA
if ... else ...
它是Henrik's NA^0
子句的代数版本。
它使用1
返回NA^1
而NA
返回FALSE
并且TRUE
和0
可以强制转换为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;
}
的值。