问题是我要构建一些表,并且某些值在特定阈值之下。例如:
S1 S2 S3
A 700 367 751
B 354 103 143
C 18 7 6
D 27 11 5
E 3 6 1
F 8 2 9
G 1 3 2
我希望保持值包含的行至少有一个值等于或大于10,并合并值小于10的行以创建名为"Other (<10)"
的行:
1 - 表的一部分,其中包含至少一个包含一个大于10的值的单元格(行C;值18):
S1 S2 S3
A 700 367 751
B 354 103 143
C 18 7 6
2 - 表中任何值大于10的部分。
E 3 6 1
F 8 2 9
G 1 3 2
最终表格的最后一行包含来自E,F和G的列的总和,包括&#34;其他(&gt; 10)&#34;行名称。像这样:
S1 S2 S3
A 700 367 751
B 354 103 143
C 18 7 6
D 27 11 5
Other(<10) 12 11 12
答案 0 :(得分:4)
如果您对R解决方案感兴趣:
filtered.df <- rbind( df[ apply(df, 1, function(x){any(x>=10)}), ],
colSums( df[ apply(df, 1, function(x){all(x< 10)}), ]))
这将是输出:
> filtered.df
# [,1] [,2] [,3]
# [1,] 700 367 751
# [2,] 354 103 143
# [3,] 18 7 6
# [4,] 27 11 5
# [5,] 12 11 12
数据:强>
df <- structure(c(700, 354, 18, 27, 3, 8, 1, 367, 103, 7, 11, 6, 2, 3, 751, 143, 6, 5, 1, 9, 2), .Dim = c(7L, 3L))
更新:包括列名和行名:
正如OP所问,对于列名和行名,这将是数据:
df <- structure(c(700, 354, 18, 27, 3, 8, 1, 367, 103, 7, 11, 6, 2, 3, 751, 143, 6, 5, 1, 9, 2), .Dim = c(7L, 3L), .Dimnames = list( c("A", "B", "C", "D", "E", "F", "G"), c("s1", "s2", "s3")))
然后使用上面的相同解决方案我们将获得:
> filtered.df
# s1 s2 s3
# A 700 367 751
# B 354 103 143
# C 18 7 6
# D 27 11 5
# 12 11 12
答案 1 :(得分:2)
你可以在python中试试这个:
np.split(...)
答案 2 :(得分:2)
R的矢量化选项是,
ind <- rowSums(df > 10) == 0
rbind(df[!ind,], colSums(df[ind,]))
# S1 S2 S3
#A 700 367 751
#B 354 103 143
#C 18 7 6
#D 27 11 5
# 12 11 12