R:在数据帧列表中查找特定元素,并将其分配给colname,然后将元素切换到右侧

时间:2019-04-26 09:03:29

标签: r list dataframe

我们有一个数据帧列表。

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]]刚刚转动并合并了数据框(参见图片)。 enter image description here   例如,列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的方法,并获得dfadfbdfc ...

这样的单独数据帧

1 个答案:

答案 0 :(得分:1)

您是否正在寻找类似的东西?

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

我们首先将factors更改为character,因为factors在数据操作中表现不佳。然后,我们使用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]