2016-08-01 21 views
1

我有一個數據幀,這是1 GB的大小,下面是一個虛擬的一個重命名在數據幀的一列一定倍數值到另一個單值

df <- data.frame(group=rep(c("A", "B", "C","D","E","F","G","H"), each=4),height=sample(100:150, 16)) 
df 
    group height 
1  A 105 
2  A 119 
3  B 108 
4  B 114 
5  C 109 
6  C 111 
7  D 148 
8  D 121 
9  E 133 
10  E 101 
11  F 143 
12  F 135 
13  G 147 
14  G 141 
15  H 150 
16  H 145 

,哪些是我的目標是要改變列組的名稱就像例如將所有B,H和G轉換爲NC,將所有A轉換成PC,以及將其他轉換爲NON ,因此我嘗試了以下一行。

de=c("B") 
df =df$group[df$group %in% de,]<-"NC" 

但它拋出下面的錯誤,

Error in `[<-.factor`(`*tmp*`, df$group %in% de, , value = "nc") : 
    incorrect number of subscripts on matrix 
In addition: Warning message: 
In `[<-.factor`(`*tmp*`, df$group %in% de, , value = "nc") : 
    invalid factor level, NA generated 

最後,數據幀DF應該是這樣的

df 
    group height 
1  PC 105 
2  PC 119 
3  NC 108 
4  NC 114 
5  NON 109 
6  NON 111 
7  NON 148 
8  NON 121 
9  NON 133 
10  NON 101 
11  NON 143 
12  NON 135 
13  NC 147 
14  NC 141 
15  NC 150 
16  NC 145 

在R或大熊貓任何建議將是真正偉大。 謝謝

+0

其實,我的數據幀是相當大的,它具有比A,B更多的價值,而C.我可以編輯我的問題很抱歉。 – user1017373

回答

1

在R您可以嘗試:

轉換爲字符第一然後直接替換該值。

df$group <- as.character(df$group); 
df$group[df$group %in% c("B")] <- "NC" 

編輯:

當你更新你的問題,你可以嘗試ifelse。當然你也可以用這種方法覆蓋group列。

df$group2 <- ifelse(df$group %in% c("B", "H", "G"), "NC", ifelse(df$group %in% c("A"), "PC", "NON")) 
head(df, 10) 
    group height group2 
1  A 139  PC 
2  A 114  PC 
3  A 132  PC 
4  A 141  PC 
5  B 107  NC 
6  B 101  NC 
7  B 122  NC 
8  B 129  NC 
9  C 100 NON 
10  C 108 NON 
+0

感謝事實上兩個解決方案工作 – user1017373

1

熊貓/ numpy的解決方案與numpy.where和布爾面膜:

print (df['group'] =='B') 
1  False 
2  False 
3  False 
4  False 
5  True 
6  True 
7  True 
8  True 
9  False 
10 False 
11 False 
12 False 
Name: group, dtype: bool 

df['group'] = np.where(df['group'] == 'B','NC','PC') 
print (df) 

    group height 
1  PC  113 
2  PC  118 
3  PC  128 
4  PC  143 
5  NC  109 
6  NC  141 
7  NC  142 
8  NC  129 
9  PC  127 
10 PC  102 
11 PC  108 
12 PC  107 

解決方案採用雙np.where

df['group'] = np.where(df['group'].isin(['B','G','H']), 'NC', 
       np.where(df['group'] == 'A', 'PC', 'NON')) 

print (df) 
    group height 
1  PC  105 
2  PC  119 
3  NC  108 
4  NC  114 
5 NON  109 
6 NON  111 
7 NON  148 
8 NON  121 
9 NON  133 
10 NON  101 
11 NON  143 
12 NON  135 
13 NC  147 
14 NC  141 
15 NC  150 
16 NC  145 
+0

對不起,你可以看看我的問題,我現在編輯它 – user1017373

+0

是的,'不'意味着'NaN'不是一個數字? – jezrael

+0

不是南..它字符串 – user1017373

0

您也可以替換組名稱如下

df$group=as.character(df$group) 
    df$group[c(3:4,13:16)]='NC' 
    df$group[c(1:2)]='PC' 
    df$group[c(5:12)]='NON' 
相關問題