首页 > 解决方案 > R:在数据框列表中查找特定元素并将其分配给 colname 并将元素切换到右侧

问题描述

让我们有一个数据框列表。

df1 <- data.frame(V1=c("a", "b", "c"),V2=c("d", "e","f"), V3=c("g","h","i"),V4=c("j","k","l"))
df2 <- data.frame(V1=c("m","n"), V2=c("o","p"), V3=c("q","r"))
l <-list(df1, df2)
> l
[[1]]
  V1 V2 V3 V4
1  a  d  g  j
2  b  e  h  k
3  c  f  i  l

[[2]]
  V1 V2 V3
1  m  o  q
2  n  p  r

在此列表中,有一个数据框被翻转,并且 colnames 作为列表的元素。数据框[[1]]刚刚翻转并合并数据框(见图)。 在此处输入图像描述 例如列 V1 和 V3 包含列名,而 V2 和 V4 是变量。

我想运行一些与数据帧中的一个元素匹配的代码(ele是一个包含原始列名称的向量):

ele <- c("a","b","c","g","h","i")

当它匹配时,它将这个元素分配为一个colname,并将右边的元素作为一个变量分配给这个列,最后我们可以获得新的数据框,例如:

dfa<-data.frame(a="d")
> dfa
  a
1 d

重要提示:注意list[[2]]不会匹配。我宁愿选择循环 / lappy 的方法并获得分离的数据帧,如dfa, dfb, dfc...

标签: rlistdataframe

解决方案


你在寻找这样的东西吗?

df1[]=apply(df1,2,as.character)

setNames(as.data.frame(t(unlist(df1[,c(FALSE,TRUE)]))),
         unlist(df1[,c(TRUE,FALSE)]))

  a b c g h i
1 d e f j k l

我们首先更改factorscharacterasfactors在数据操作中表现不佳。然后我们使用c(FALSE,TRUE)选择偶数列,即 的内容dataframe并分配名称,即赔率 ( c(TRUE,FALSE))

编辑

检查名称引用之间的匹配以执行该过程。

ele <- c("a","b","c","g","h","i")

l = lapply(l, function(x){
  x[]=apply(x,2,as.character)

  if (any(unlist(x)%in%ele)){
    setNames(as.data.frame(t(unlist(x[,c(FALSE,TRUE)]))),
            unlist(x[,c(TRUE,FALSE)]))
  } else {NA}
})

l

[[1]]
  a b c g h i
1 d e f j k l

[[2]]
NULL

如果要删除nulls使用l[lengths(l) != 0]


推荐阅读