Нужно добавить столбец во фрейм данных. Данные находятся в другом векторе и являются только подмножеством одного исходного столбца DF для справки. - PullRequest
1 голос
/ 21 февраля 2012

Я полный новичок с R и прошу вашей помощи.

У меня есть фрейм данных DF, подобный этому:

user      age    email        address   ...
user1     20     u1@domain    address1  ...
user2     19     u2@domain    address2  ...
user3     30     u3@domain    address3  ...
...
userm     32     um@domain    addressm ...
...
usern     xx     un@domain    address4  ...

У меня есть следующий вектор:

user1
user3
...
userm

Мне нужно следующее:

user      age    email        address   newcol ...
user1     20     u1@domain    address1  yes    ...
user2     19     u2@domain    address2  no     ...
user3     30     u3@domain    address3  yes    ...
...
userm     32     um@domain    addressm  yes    ...
...
usern     xx     un@domain    address4  no     ...

Короче говоря, добавьте новый столбец в DF, содержащий no (по умолчанию) и yes, если соответствующий пользователь находится в векторе.

Любой совет приветствуется, спасибо за ваше время.

Ответы [ 6 ]

2 голосов
/ 21 февраля 2012

Чтобы расширить ответ Джорана:

Предполагая, что ваш 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 голос
/ 21 февраля 2012

Вы можете сделать это так ...

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

или так

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

Первый вариант на удивление более эффективен

1 голос
/ 21 февраля 2012

Вероятно, это не самый эффективный пример, но, похоже, он работает:

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";
}
0 голосов
/ 26 октября 2016

Чтобы определить, присутствуют ли ваши значения в векторе, вы можете напрямую объединить 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"
0 голосов
/ 18 апреля 2015

Вы можете просто использовать% в функции%

df$newcol <- ifelse(df$user %in% vec, 'yes', 'no')
0 голосов
/ 21 февраля 2012
vNoYes <- c("No","Yes")# vector with new codes
idx <- (df$user %in% v)+1L# position of codes in data frame
df$newcol <- vNoYes[idx]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...