gpt4 book ai didi

用它们各自的总和替换分隔的数据帧值

转载 作者:行者123 更新时间:2023-12-05 00:20:32 24 4
gpt4 key购买 nike

如何将“0|0”、“0|1”、“1|0”、“1|1”、“2|0”替换为“0”、“1”、“1”、“2”、 “2”,分别在一个数据框中?例如:

df1 <- data.frame(A = c("0|0", "1|1", "0|1"), B = c("2|0", "0|0", "1|0"))

预期结果是每对的总和,即:
df2 <- data.frame(A = c("0", "2", "1"), B = c("2", "0", "1"))

最佳答案

这是一个尝试。如果您需要第二个数据框,请使用 df2 <- df1首先,您将拥有旧的和新的( df2 将是旧的),或者用 as.data.frame() 包裹它并称之为 df2 .

df1[] <- lapply(df1, function(x) {
## split the column on '|'
s <- strsplit(as.character(x), "|", fixed = TRUE)
## coerce to numeric and find the sum
vapply(s, function(a) sum(as.numeric(a)), 1)
})

这使
df1
# A B
# 1 0 2
# 2 2 0
# 3 1 1

您想要的结果显示字符值,但在求和后再次强制返回字符似乎很愚蠢。因此,我将它们保留为数字。您以后可能会发现这很有用。

编辑 1:或者,您可以替换 strsplit()scan()少写一点。
df1[] <- lapply(df1, function(x) { 
vapply(as.character(x), function(a) sum(scan(text = a, sep = "|")), 1)
})

编辑 2:这是第三种方法,它很简洁,不使用任何嵌套循环。我们重新读取分隔的数据,然后使用 df1 重构它。属性。
rs <- rowSums(read.table(text = as.matrix(df1), sep = "|"))
dim(rs) <- dim(df1)
dimnames(rs) <- dimnames(df1)
as.data.frame(rs)
# A B
# 1 0 2
# 2 2 0
# 3 1 1

或者为了好玩,同一件事的荒谬单行版本......
as.data.frame(
`dimnames<-`(
`dim<-`(
rowSums(read.table(text = as.matrix(df1), sep = "|")),
dim(df1)
),
dimnames(df1)
)
)
# A B
# 1 0 2
# 2 2 0
# 3 1 1

关于用它们各自的总和替换分隔的数据帧值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34301399/

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