2017-06-21 208 views
0

我正在處理數據幀,並且需要提取數據,如下所示:基於數據幀中另一列的另一列中的列提取值R

我有以下數據幀。

a = c(1:40) 
b = c(41:80) 
c = c(81:120) 
d = c('a','b','c','d','e') 
e = NA 
f = NA 
g = NA 
df = cbind.data.frame(a,b,c,d,e,f,g) 
names(df) = c('1m','2m','3m','reg','1m_comp','2m_comp','3m_comp') 


1m 2m 3m reg 1m_comp 2 m_comp 3m_comp 
1 41 81 a  NA  NA  NA 
2 42 82 b  NA  NA  NA 
3 43 83 c  NA  NA  NA 
4 44 84 d  NA  NA  NA 
5 45 85 e  NA  NA  NA 
6 46 86 a  NA  NA  NA 

我使用函數內從「1米」,「2米」列填充的值「小樣」列如果「REG」列具有一定的值。

我這樣做:

df = within(df, { 
1m[reg=='a'] <- 1m_comp[reg=='a'] 
2m[reg=='a'] <- 2m_comp[reg=='a'] 
3m[reg=='a'] <- 3m_comp[reg=='a']}) 

,我的工作就有46個+ 46這樣的列(列和譜曲)的數據幀。我沒有寫46行代碼,而是嘗試了

df = within(df, { 
for (i in 1:46) { 
str_c(i,'m_comp')[reg=='a'] = str_c(i,'m')[reg=='a']}}) 

但是,我看不到數據框中的變化。我也沒有看到任何錯誤。

編輯:立即解決!謝謝d.b.

+1

'DF [DF $ REG == 「一」,5:7] = DF [DF $ REG == 「一」,1:3]' –

+0

是否有可能做到這一點使用列名而不是列號? – NiRa

+1

'df [df $ reg ==「a」,c(「1m_comp」,「2m_comp」,「3m_comp」)] = df [df $ reg ==「a」,c(「1m」,「2m」, 「3m」)]' –

回答

1

如果你不想硬編碼所有的列名,你可以使用這樣的東西。

comp.cols <- colnames(df)[grepl("_comp", colnames(df)) == TRUE] 
non.comp.cols <- sub("_comp", "", comp.cols) 

df[df[,"reg"] == "a", comp.cols] <- df[df[,"reg"] == "a", non.comp.cols] 
相關問題