【问题标题】:Convert a dataframe (the first column is the element, the second is the class to which it belongs) to a list of classes将数据框(第一列是元素,第二列是它所属的类)转换为类列表
【发布时间】:2021-02-03 11:06:05
【问题描述】:

我有以下数据框:

df=data.frame(term=c("hello","affirms","allows","hello","always","allows","allows","affirms"),
       class=c("class 1","class 1","class 2", "class 2", "class 2","class 3","class 4","class 
4"),stringsAsFactors = FALSE)
df
     term   class
1   hello class 1
2 affirms class 1
3  allows class 2
4   hello class 2
5  always class 2
6  allows class 3
7  allows class 4
8 affirms class 4

我想获得这样的列表:

combinations <- list(
  hello   = c("class 1", "class 2"),
  affirms = c("class 1", "class 4"),
  allows  = c("class 2", "class 3", "class 4"),
  always  = c("class 2")
)

Split data.frame based on levels of a factor into new data.frames 中提出的解决方案不适合我的问题,因为如果我应用了上述问题的公认答案:

X <- split(df, df$class)
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 1]) 
names(Y) <- c("class 1", "class 2", "class 3", "class 4")
list2env(Y, envir = .GlobalEnv)
`class 1`

我得到

"hello"   "affirms"

这不是我们想要的结果。无论如何,我尝试用这种方式修改代码:

X <- split(df, df$term)
Y <- lapply(seq_along(X), function(x) as.data.frame(X[[x]])[, 2]) 

结果似乎接近预期的结果,但是:

Y
[[1]]
[1] "class 1" "class 4"

[[2]]
[1] "class 2" "class 3" "class 4"

[[3]]
[1] "class 2"

[[4]]
[1] "class 1" "class 2"

我怎么知道例如Y[[4]]对应hello,而Y[[2]]对应allows

【问题讨论】:

  • 你需要的不是split(df$class, df$term)吗?
  • @RonakShah,谢谢,是的,这正是我所需要的。

标签: r list dataframe


【解决方案1】:

使用split

split(df$class, df$term)

#$affirms
#[1] "class 1"   "class 4"

#$allows
#[1] "class 2" "class 3" "class 4"

#$always
#[1] "class 2"

#$hello
#[1] "class 1" "class 2"

【讨论】:

    【解决方案2】:

    我们可以使用group_split

    library(dplyr)
    df %>%
        group_split(term)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 2021-05-01
      • 1970-01-01
      • 2021-05-19
      • 2019-06-16
      • 2022-07-10
      • 1970-01-01
      相关资源
      最近更新 更多