2012-02-21 40 views
1

我是一個完整的新手與R,我要求你的幫助。需要將一列添加到數據框。該數據是在另一個向量,只是一個原始的DF列的參考文獻的一個子集

我有一個數據幀DF是這樣的:

user  age email  address ... 
user1  20  [email protected] address1 ... 
user2  19  [email protected] address2 ... 
user3  30  [email protected] address3 ... 
... 
userm  32  [email protected] addressm ... 
... 
usern  xx  [email protected] address4 ... 

我有一個向量如下:

user1 
user3 
... 
userm 

我需要具備以下條件:

user  age email  address newcol ... 
user1  20  [email protected] address1 yes ... 
user2  19  [email protected] address2 no  ... 
user3  30  [email protected] address3 yes ... 
... 
userm  32  [email protected] addressm yes ... 
... 
usern  xx  [email protected] address4 no  ... 

在短,向DF添加一個新的列,其中包含no(默認),如果通訊錄用戶在向量中,則爲yes。

任何意見,表示感謝, 感謝您的時間。

+1

您基本上在最後一句話中描述了一個非常好的解決方案。第0步:創建一個新的列,只是「否」... – joran 2012-02-21 00:30:47

+0

我會加入@ joran的幫助提示:'%in%'運算符將一個向量與另一個向量進行比較。 data.frame的一列只是一個向量。 – 2012-02-21 00:37:17

+0

好的,我會回答!但他們的建議應該是充足的,沒有以下答案:) – Justin 2012-02-21 00:40:07

回答

2

要擴大Joran的回答是:

假設你data.frame被命名爲DF。使你的data.frame稱爲NEWCOL新列:

df$newcol <- 'no' 

然後更改NEWCOL價值觀爲「yes」,如果他們是你的%in%向量(我假設它的命名VEC)。

df$newcol[df$user %in% vec] <- 'yes' 

你也可以做到這一點使用ifelse中的一個步驟:

df$newcol <- ifelse(df$user %in% vec, 'yes', 'no') 

或者,如果你想變得棘手,你可以使用merge(..., all=TRUE) ...

1

這可能不是最有效的例子,但它似乎工作:

data<-data.frame(c(1,2,3,4,5),c("a","b","c","d","e")); 
colnames(data)<-c("numbers","names"); 
lookup<-c("a","d","e") 

data$newcol<-rep("no",dim(data)[1]) 

for(i in 1:length(lookup)){ 
store<-which(data$names==lookup[i]) 
data$newcol[store]<-"yes"; 
} 
1

你可以這樣來做。 ..

DF$newcol <- 'no' 
DF$newcol[DF$user %in% newVector] <- 'yes' 

或這種方式

DF$newcol <- ifelse(DF$user %in% newVector, 'yes', no) 

前者是驚人地更有效

0
vNoYes <- c("No","Yes")# vector with new codes 
idx <- (df$user %in% v)+1L# position of codes in data frame 
df$newcol <- vNoYes[idx] 
0

,你可以簡單地使用%的%函數

df$newcol <- ifelse(df$user %in% vec, 'yes', 'no') 
+0

堆棧溢出通常要求您在答案中給出上下文和解釋,以便將其視爲高質量。請考慮擴大你的答案。 – 2015-04-18 08:21:32

0

要檢測是你的價值觀是存在於載體,你可以直接合並2數據幀。如果大數據集中的IFelse語句或%in%語句由於多次匹配而需要更多時間,這尤其有用。

例如。

vec=data.frame(user=vec) #converting vector to dataframe 
DF <-merge(DF,unique(vec),by="user",all.x=T) #similar to left join in sql 
DF$newcol<- "yes" #creating a new column having all values as yes 
DF$newcol[is.na(DF$user2)]<- "no" #all the rows which were not present in the vector will be NAs in the newly joined column hence substituting these values as "no" 
相關問題