R 需要向数据框添加列。数据位于另一个向量中,仅为一个原始DF列的子集,以供参考

R 需要向数据框添加列。数据位于另一个向量中,仅为一个原始DF列的子集,以供参考,r,R,我是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

我是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     ...
我需要具备以下条件:

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

任何建议都将不胜感激,
谢谢你抽出时间

这可能不是最有效的例子,但似乎有效:

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";
}

这可能不是最有效的示例,但似乎有效:

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";
}

要进一步阐述Joran的答案:

假设您的data.frame名为df。在data.frame中创建一个名为newcol的新列:

df$newcol <- 'no'
您也可以使用ifelse一步完成此操作:


或者,如果您想变得棘手,可以使用merge…,all=TRUE…

来扩展Joran的答案:

假设您的data.frame名为df。在data.frame中创建一个名为newcol的新列:

df$newcol <- 'no'
您也可以使用ifelse一步完成此操作:


或者,如果你想变得棘手,你可以使用merge…,all=TRUE…

你可以这样做

DF$newcol <- 'no'
DF$newcol[DF$user %in% newVector] <- 'yes'
还是这样

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

前者的效率惊人地高

你可以这样做

DF$newcol <- 'no'
DF$newcol[DF$user %in% newVector] <- 'yes'
vNoYes <- c("No","Yes")# vector with new codes
idx <- (df$user %in% v)+1L# position of codes in data frame
df$newcol <- vNoYes[idx]
还是这样

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

前者的效率惊人地更高

您只需使用%in%函数即可

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

您只需在%函数中使用%即可

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

要检测向量中是否存在值,可以直接合并2个数据帧。在大型数据集中,由于多对多匹配,IFelse语句或%in%语句可能需要更多时间,这一点尤其有用

例如


要检测向量中是否存在值,可以直接合并2个数据帧。在大型数据集中,由于多对多匹配,IFelse语句或%in%语句可能需要更多时间,这一点尤其有用

例如


你在最后一句话中基本上描述了一个完美的解决方案。步骤0:创建一个新的列just no…我将添加到@joran的有用提示中:%in%操作符将一个向量与另一个向量进行比较。一列data.frame只是一个向量。好吧,我来回答!但如果没有以下答案,他们的建议应该足够多:谢谢大家。我缺少的是%中的%。我是从Algol、Fortran、Pascal到R的,现在是php。R对我来说是一种奇怪的动物。你在最后一句话中基本上描述了一个完美的解决方案。步骤0:创建一个新的列just no…我将添加到@joran的有用提示中:%in%操作符将一个向量与另一个向量进行比较。一列data.frame只是一个向量。好吧,我来回答!但如果没有以下答案,他们的建议应该足够多:谢谢大家。我缺少的是%中的%。我是从Algol、Fortran、Pascal到R的,现在是php。对我来说,R是一种奇怪的动物。堆栈溢出通常要求你在答案中给出上下文和解释,如果它们被认为是高质量的。请考虑扩展您的答案。堆栈溢出通常要求您在答案中给出上下文和解释,如果它们被认为是高质量的。请考虑扩大你的答案。