用常量分隔列,并将它们压缩到R data.frame中的一行
我有一个名为用常量分隔列,并将它们压缩到R data.frame中的一行,r,function,loops,dataframe,R,Function,Loops,Dataframe,我有一个名为d的data.frame。在此data.frame中,有些列由横跨第一列的行的常量数字组成:study.name(见下文) 例如,ESL、ESL.1、prof和prof.1列是Shin.Ellis所有行的常量,也是Trus.Hsu所有行的常量,依此类推 Q:在基数R中,如何分离这些常量变量,然后将它们压缩为一行,只包含一个数字 下面进一步显示了我想要的输出。一个功能性的答案是赞赏的 d <- read.csv("https://raw.githubusercontent.com
d
的data.frame。在此data.frame中,有些列由横跨第一列的行的常量数字组成:study.name
(见下文)
例如,ESL
、ESL.1
、prof
和prof.1
列是Shin.Ellis
所有行的常量,也是Trus.Hsu
所有行的常量,依此类推
Q:在基数R中,如何分离这些常量变量,然后将它们压缩为一行,只包含一个数字
下面进一步显示了我想要的输出。一个功能性的答案是赞赏的
d <- read.csv("https://raw.githubusercontent.com/izeh/m/master/irr.csv", h = T)[-(2:3)]
## FIRST 8 ROWS:
# study.name ESL prof scope type ESL.1 prof.1 scope.1 type.1
# 1 Shin.Ellis 1 2 1 1 1 2 1 1
# 2 Shin.Ellis 1 2 1 1 1 2 1 1
# 3 Shin.Ellis 1 2 1 2 1 2 1 1
# 4 Shin.Ellis 1 2 1 2 1 2 1 1
# 5 Shin.Ellis 1 2 NA NA 1 2 NA NA
# 6 Shin.Ellis 1 2 NA NA 1 2 NA NA
# 7 Trus.Hsu 2 2 2 1 2 2 1 1
# 8 Trus.Hsu 2 2 NA NA 2 2 NA NA
如果您只想删除所有列中的重复值,unique()是base R
unique(d)
编辑-感谢@CalumYou的澄清-我想这就是OP在BaseR中寻找的
is_constant = lapply(split(d, d$study.name), function(data){
unlist(lapply(data,function(col){
length(unique(col)) == 1
}))
})
is_constant = as.data.frame(do.call(rbind, is_constant))
all_constant = d[,unlist(lapply(is_constant,all))]
all_constant = unique(all_constant)
如果您只想删除所有列中的重复值,unique()是base R
unique(d)
编辑-感谢@CalumYou的澄清-我想这就是OP在BaseR中寻找的
is_constant = lapply(split(d, d$study.name), function(data){
unlist(lapply(data,function(col){
length(unique(col)) == 1
}))
})
is_constant = as.data.frame(do.call(rbind, is_constant))
all_constant = d[,unlist(lapply(is_constant,all))]
all_constant = unique(all_constant)
也许是我们需要的
library(dplyr)
d %>%
group_by(study.name) %>%
slice(1)
或者在按“study.name”分组后的
base R
中,获取第一行,同时指定na.action=NULL
,因为默认选项为na.ommit
,它可以忽略任何列中具有na
的任何行
aggregate(.~ study.name, d, head, 1, na.action = NULL)
nm1 <- names(which(!colSums(!do.call(rbind, by(d[-1], d$study.name,
FUN = function(x) lengths(sapply(x, unique)) == 1)))))
unique(d[c("study.name", nm1)])
如果我们想对列进行子集划分
aggregate(.~ study.name, d, head, 1, na.action = NULL)
nm1 <- names(which(!colSums(!do.call(rbind, by(d[-1], d$study.name,
FUN = function(x) lengths(sapply(x, unique)) == 1)))))
unique(d[c("study.name", nm1)])
nm1可能是我们需要的
library(dplyr)
d %>%
group_by(study.name) %>%
slice(1)
或者在按“study.name”分组后的base R
中,获取第一行,同时指定na.action=NULL
,因为默认选项为na.ommit
,它可以忽略任何列中具有na
的任何行
aggregate(.~ study.name, d, head, 1, na.action = NULL)
nm1 <- names(which(!colSums(!do.call(rbind, by(d[-1], d$study.name,
FUN = function(x) lengths(sapply(x, unique)) == 1)))))
unique(d[c("study.name", nm1)])
如果我们想对列进行子集划分
aggregate(.~ study.name, d, head, 1, na.action = NULL)
nm1 <- names(which(!colSums(!do.call(rbind, by(d[-1], d$study.name,
FUN = function(x) lengths(sapply(x, unique)) == 1)))))
unique(d[c("study.name", nm1)])
nm1d_listd_list你可以试试这样的东西,尽管感觉有点笨拙。基本上,按组检查所有组中哪些列具有常量值,只保留这些列,然后只保留唯一的值(因为现在它们按组是常量)
d你可以试试这样的东西,尽管感觉有点笨拙。基本上,按组检查所有组中哪些列具有常量值,只保留这些列,然后只保留唯一的值(因为现在它们按组是常量)
d这似乎不是OP的问题,他们想找出哪些列是按组固定的groups@CalumYou,谢谢你的回答。这正是我想要的。似乎这不是OP的问题,他们想找出哪些列是按组固定的groups@CalumYou,谢谢你的回答。这正是我想要的。这不就是没有NAs的第一行吗?它不会限制每个组的常量列,这不是只得到没有NAs的第一行吗?它不会限制为每个组的常量列