R 基于多个其他列的一列的最大值
我想这个问题相当具体 我正在寻找R等价的Stata-egen函数,尤其是 艾根·马克斯是瓦利斯特 在我的数据表中,我有一个ID为的列R 基于多个其他列的一列的最大值,r,max,dummy-variable,R,Max,Dummy Variable,我想这个问题相当具体 我正在寻找R等价的Stata-egen函数,尤其是 艾根·马克斯是瓦利斯特 在我的数据表中,我有一个ID为的列 ID <- c(1,1,2,2,3,4,5,6,6) 实际上,如果具有相同ID和年份的所有行的名称都是NA,我希望R返回0。所以我得到(1,1,1,1,0,1,1,0,0),我可以继续删除第5,7,8行。 谢谢大家! 这里尝试使用ave,但此逻辑将适用于您可能知道的任何分组函数。按组查找NAs,查看它们是否为(!/否定)全部正确: ave(is.na(da
ID <- c(1,1,2,2,3,4,5,6,6)
实际上,如果具有相同ID和年份的所有行的名称都是NA,我希望R返回0。所以我得到(1,1,1,1,0,1,1,0,0),我可以继续删除第5,7,8行。
谢谢大家! 这里尝试使用
ave
,但此逻辑将适用于您可能知道的任何分组函数。按组查找NA
s,查看它们是否为(!
/否定
)全部
正确
:
ave(is.na(dat[["names"]]), dat[c("ID","year")], FUN=Negate(all))
#[1] TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
其中,dat
为:
dat <- data.frame(ID,year,names, stringsAsFactors=FALSE)
dat这里有一个使用ave
的尝试,但是这个逻辑将适用于您可能知道的任何分组函数。按组查找NA
s,查看它们是否为(!
/否定
)全部
正确
:
ave(is.na(dat[["names"]]), dat[c("ID","year")], FUN=Negate(all))
#[1] TRUE TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE
其中,dat
为:
dat <- data.frame(ID,year,names, stringsAsFactors=FALSE)
dat我们可以用tidyverse
library(dplyr)
df1 %>%
group_by(ID, year) %>%
mutate(dummy = as.integer(any(!is.na(names))))
# A tibble: 9 x 4
# Groups: ID, year [7]
# ID year names dummy
# <dbl> <dbl> <fctr> <int>
#1 1.00 2000 Mark 1
#2 1.00 2000 <NA> 1
#3 2.00 2001 John 1
#4 2.00 2002 John 1
#5 3.00 2002 <NA> 0
#6 4.00 2003 Sarah 1
#7 5.00 2004 Julia 1
#8 6.00 2004 <NA> 0
#9 6.00 2004 <NA> 0
库(dplyr)
df1%>%
分组依据(ID,年份)%>%
mutate(dummy=as.integer(任意(!is.na(名称)))
#一个tibble:9x4
#组:ID,年份[7]
#身份证年份名称
#
#1 1.00 2000马克1
#2 1.00 2000 1
#3.2.00 2001约翰1
#4.2.00 2002约翰1
#5 3.00 2002 0
#6.4.00 2003莎拉1
#7.5.00 2004 Julia 1
#8 6.00 2004 0
#9 6.00 2004 0
数据
df1我们可以用tidyverse
library(dplyr)
df1 %>%
group_by(ID, year) %>%
mutate(dummy = as.integer(any(!is.na(names))))
# A tibble: 9 x 4
# Groups: ID, year [7]
# ID year names dummy
# <dbl> <dbl> <fctr> <int>
#1 1.00 2000 Mark 1
#2 1.00 2000 <NA> 1
#3 2.00 2001 John 1
#4 2.00 2002 John 1
#5 3.00 2002 <NA> 0
#6 4.00 2003 Sarah 1
#7 5.00 2004 Julia 1
#8 6.00 2004 <NA> 0
#9 6.00 2004 <NA> 0
库(dplyr)
df1%>%
分组依据(ID,年份)%>%
mutate(dummy=as.integer(任意(!is.na(名称)))
#一个tibble:9x4
#组:ID,年份[7]
#身份证年份名称
#
#1 1.00 2000马克1
#2 1.00 2000 1
#3.2.00 2001约翰1
#4.2.00 2002约翰1
#5 3.00 2002 0
#6.4.00 2003莎拉1
#7.5.00 2004 Julia 1
#8 6.00 2004 0
#9 6.00 2004 0
数据
df1我对Stata不熟悉,但根据您的描述,这应该可以做到:
mydata <- data.frame(
ID = c(1,1,2,2,3,4,5,6,6),
year = c(2000,2000,2001,2002,2002,2003,2004,2004,2004),
names = c("Mark",NA,"John","John",NA,"Sarah","Julia",NA,NA),
stringsAsFactors = FALSE
)
mydata$dummy <- as.integer(!is.na(mydata$names))
max_dummy <- aggregate(mydata$dummy, mydata[c("ID","year")], max)
has_name <- subset(merge(mydata, max_dummy), x > 0)[-5]
has_name
mydata我对Stata不熟悉,但根据您的描述,这应该可以做到:
mydata <- data.frame(
ID = c(1,1,2,2,3,4,5,6,6),
year = c(2000,2000,2001,2002,2002,2003,2004,2004,2004),
names = c("Mark",NA,"John","John",NA,"Sarah","Julia",NA,NA),
stringsAsFactors = FALSE
)
mydata$dummy <- as.integer(!is.na(mydata$names))
max_dummy <- aggregate(mydata$dummy, mydata[c("ID","year")], max)
has_name <- subset(merge(mydata, max_dummy), x > 0)[-5]
has_name
mydata谢谢,但似乎不起作用。完成。案例(ID、年份、名称)返回[1]TRUE FALSE FALSE FALSE,这不是我想要的。是否希望!使用(dat、ave(is.na(名称)、列表(ID、年份)、FUN=all))
或类似工具dat
beingdat@thelatemail是的,也许问题不是非常清楚,但这会返回正确的结果。我试图查看帮助页面,但我不完全清楚为什么会这样。请你解释一下为什么我们要取平均值?编辑:已回答以下问题,但似乎不起作用。完成。案例(ID、年份、名称)返回[1]TRUE FALSE FALSE FALSE,这不是我想要的。是否希望!使用(dat、ave(is.na(名称)、列表(ID、年份)、FUN=all))
或类似工具dat
beingdat@thelatemail是的,也许问题不是非常清楚,但这会返回正确的结果。我试图查看帮助页面,但我不完全清楚为什么会这样。请你解释一下为什么我们要取平均值?编辑:下面已经回答了为什么不ave(!is.na(dat[[“names”]),dat[c(“ID”,“year”)],FUN=all)
?@Onyambu-当然。只是个人喜好,但也可以。为什么不ave(!is.na(dat[[“name”]”)、dat[c(“ID”,“year”)、FUN=all)
?@Onyambu-当然可以。只是个人喜好,但这也行。
mydata <- data.frame(
ID = c(1,1,2,2,3,4,5,6,6),
year = c(2000,2000,2001,2002,2002,2003,2004,2004,2004),
names = c("Mark",NA,"John","John",NA,"Sarah","Julia",NA,NA),
stringsAsFactors = FALSE
)
mydata$dummy <- as.integer(!is.na(mydata$names))
max_dummy <- aggregate(mydata$dummy, mydata[c("ID","year")], max)
has_name <- subset(merge(mydata, max_dummy), x > 0)[-5]
has_name