用常量分隔列,并将它们压缩到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)])

nm1
d_list
d_list你可以试试这样的东西,尽管感觉有点笨拙。基本上,按组检查所有组中哪些列具有常量值,只保留这些列,然后只保留
唯一的
值(因为现在它们按组是常量)


d你可以试试这样的东西,尽管感觉有点笨拙。基本上,按组检查所有组中哪些列具有常量值,只保留这些列,然后只保留
唯一的
值(因为现在它们按组是常量)


d这似乎不是OP的问题,他们想找出哪些列是按组固定的groups@CalumYou,谢谢你的回答。这正是我想要的。似乎这不是OP的问题,他们想找出哪些列是按组固定的groups@CalumYou,谢谢你的回答。这正是我想要的。这不就是没有NAs的第一行吗?它不会限制每个组的常量列,这不是只得到没有NAs的第一行吗?它不会限制为每个组的常量列