gpt4 book ai didi

r - 将变量从逗号拆分为有序数据框

转载 作者:行者123 更新时间:2023-12-05 02:27:45 25 4
gpt4 key购买 nike

我有一个这样的数据框,其中的值用逗号分隔。

# Events
# A,B,C
# C,D
# B,A
# D,B,A,E
# A,E,B

我想要下一个数据框

# Event1  Event2  Event3  Event4  Event5
# A B C NA NA
# NA NA C NA NA
# A B NA NA NA
# A B NA D E
# A B NA NA E

我尝试过使用 cSplit,但没有所需的 df。可能吗?

注意:这些值不会出现在与第二个数据框中的变量事件相同的位置。

最佳答案

1) 这是一个基本的 R 解决方案。拆分每一行给出列表 s 并创建包含可能值的 cols。然后迭代 s 并将其转换为数据框。

请注意,这不会对列名进行硬编码,即使某些列名是其他列名的子字符串,它也会继续工作。

s <- strsplit(DF$Events, ",")
cols <- unique(sort(unlist(s)))

data.frame(Event = t(sapply(s, function(x) ifelse(cols %in% x, cols, NA))))

给予:

  Event.1 Event.2 Event.3 Event.4 Event.5
1 A B C <NA> <NA>
2 <NA> <NA> C D <NA>
3 A B <NA> <NA> <NA>
4 A B <NA> D E
5 A B <NA> <NA> E

2) 这个基础 R 解决方案如上所述使用 strsplit,然后命名组件,因为 stack 需要一个命名列表,然后调用 堆栈。然后我们使用 tapply 将其扩展为宽格式,并将其转换为数据框并修复名称。

s <- strsplit(DF$Events, ",")
names(s) <- seq_along(s)
stk <- stack(s)

mat <- t(tapply(stk$values, stk, c))
colnames(mat) <- NULL
data.frame(Event = mat)

给予:

  Event.1 Event.2 Event.3 Event.4 Event.5
1 A B C <NA> <NA>
2 <NA> <NA> C D <NA>
3 A B <NA> <NA> <NA>
4 A B <NA> D E
5 A B <NA> <NA> E

这也可以表示为 R 4.2+ 管道:

DF |>
with(setNames(Events, seq_along(Events))) |>
strsplit(",") |>
stack() |>
with(tapply(values, data.frame(ind, values), c)) |>
`colnames<-`(NULL) |>
data.frame(Event = _)

注意事项

可重现形式的输入:

Lines <- "Events
A,B,C
C,D
B,A
D,B,A,E
A,E,B"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)

关于r - 将变量从逗号拆分为有序数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72940708/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com