Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于多个其他列的一列的最大值_R_Max_Dummy Variable - Fatal编程技术网

R 基于多个其他列的一列的最大值

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

我想这个问题相当具体

我正在寻找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
,但此逻辑将适用于您可能知道的任何分组函数。按组查找
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
being
dat@thelatemail是的,也许问题不是非常清楚,但这会返回正确的结果。我试图查看帮助页面,但我不完全清楚为什么会这样。请你解释一下为什么我们要取平均值?编辑:已回答以下问题,但似乎不起作用。完成。案例(ID、年份、名称)返回[1]TRUE FALSE FALSE FALSE,这不是我想要的。是否希望
!使用(dat、ave(is.na(名称)、列表(ID、年份)、FUN=all))
或类似工具
dat
being
dat@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