2016-04-04 29 views
1

This Issue幾乎是我想要做的,除了輸出作爲數據幀列表的事實。讓我們重現上面提到的SE問題的例子。R中的多個數據幀具有相同的功能 - 不在數據幀列表中

比方說,我有2個數據幀:

df1 
ID col1 col2 
x 0  10 
y 10 20 
z 20 30 

df1 
ID col1 col2 
a 0  10 
b 10 20 
c 20 30 

我要的是有ifelse結果的第4列。我的理由是:

如果在任何data.frame中col1> = 20我可以用模式「df」命名,然後新列res = 1,否則res = 0。

但我想在每個data.frame中創建一個具有相同名稱模式的新列,並不是將所有這些data.frames放在一個列表中並應用該函數,除非我能夠「提取」此列表返回到單個數據框。

感謝

+0

你的意思是你想在你的工作空間中使用對象'df1'和'df2' [我假設你的例子中有重複的名字是一個錯字]來創建新的列,但是你想要一個單行而不是寫'df1 $ ... = ...'和'df2 $ ... = ...'? – Philip

回答

3

每@Frank ...如果我對你所尋找的理解是正確的,可以考慮使用data.table。 MWE:

library(data.table); 
addcol <- function(x) x[,res:=ifelse(col1>=20,1,0)] 
df1 <- data.table(ID=c("x","y","z"),col1=c(0,10,20),col2=c(10,20,30)) 
df2 <- data.table(ID=c("x","y","z"),col1=c(20,10,20),col2=c(10,20,30)) 
#modified df2 so you can see different effects 
lapply(list(df1,df2),addcol) 

> df1 
    ID col1 col2 res 
1: x 0 10 0 
2: y 10 20 0 
3: z 20 30 1 

> df2 
    ID col1 col2 res 
1: x 20 10 1 
2: y 10 20 0 
3: z 20 30 1 

這工作,因爲data.table通過對錶基準進行操作,所以在函數內部你實際更新基礎表,不僅範圍的參照表。

+0

很棒@Philip !!做得很好!非常感謝。 – Jecogeo

+1

另一個注意:'ifelse(cond,1,0)'可以寫成'as.integer(cond)',這通常是值得的,因爲'ifelse'可能很慢http://stackoverflow.com/q/16275149此外,它給你整數,而不是浮動。 – Frank

相關問題