2017-06-06 167 views
1

問題是我有一些要建立的表,有些值是在特定的閾值之下。例如:按最小值對行進行分組

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列的總和,包括「其他(> 10)」行的名稱。就像這樣:

  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

的溶液可能與'申請(DF,1,最大值)'' – G5W

+0

filtered.df <開始 - DF [應用(DF,1 ,函數(x){all(x> 10)}),]'這會給你第一部分。然後你可以加上那些小於10的數。 – Masoud

+0

@ G5W或者只是df.max(1) – EFT

回答

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 

Data:

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 
+2

不錯,簡潔! – G5W

+0

@Masoud確實如此,但它消除了標題和行名稱。保留它們並創建「其他(<10)」行將會很有趣。 –

+2

@FelipeLira號我剛在結構化數據中沒有列名。它根本不影響行名或列名。 – Masoud

2

你可以在Python試試這個:

data = ["700 367 751", "354 103 143", "18 7 6", "27 11 5", "3 6 1", "8 2 9", "1 3 2"] 

new_data = [map(int, i.split()) for i in data] 

final_data = [] 

extra_data = [0, 0, 0] 

for i in new_data: 
    if any(b >= 10 for b in i): 
     final_data.append(i) 

    else: 
     extra_data = [extra_data[c]+b for c, b in enumerate(i)] 

final_data.append(extra_data) 

print final_data 
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 
相關問題