首页 > 解决方案 > 在 r 中创建与 df 不同的数组

问题描述

因此,给定以下列,我需要创建一个新数组,其中包含列之间的差异,例如下面的示例我需要创建一个数组,其中包含 str 为每个房屋的平均一分和二分之间的差异,所以到目前为止,我有一些类似 summarise(diff = abs(diff(one,two)), .groups = "drop") 但它并不安静,我会怎么做?

,,house = reg

str    one   two three 
reg    443    518  440
smol  342    587  432
regai   534    597  443

,,house = smol

str    one   two three 
reg    530    586  435
smol  541    597  447
regai   539    602  439

因此,就像我的理想输出看起来像这样,而不是数据框,数组看起来像:

str      reg    smol 
reg     440-518 435-586
smol   432-587  447-597
regai  443-597  439-602

所以我想做的是提取每一列创建新列并有所作为,然后最后结合所有的差异,但这个过程会花费太长时间,所以我试图找到更短的方法。我还需要确保输出是绝对值

现在更新我正在做这样的事情:

diff = (abs(df$3 - df$2))

标签: r

解决方案


我们可以做的

cbind(df1[1], setNames(lapply(list(df1, df2), 
         function(x) abs(x$three - x$two)), c('reg', 'smol')))

-输出

#     str reg smol
#1   reg  78  151
#2  smol 155  150
#3 regai 154  163

如果它是arraycreated from xtabs,一个选项也是

out1 <- lapply(seq_len(dim(input_data)[3]), function(i) {

         x <- as.data.frame(input_data[,, i])
         abs(x$three - x$two)
         })
names(out1) <- c('reg', 'smol')
cbind(as.data.frame(input_data[,,1])[1]), out1)

数据

df1 <- structure(list(str = c("reg", "smol", "regai"), one = c(443L, 
342L, 534L), two = c(518L, 587L, 597L), three = c(440L, 432L, 
443L)), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(str = c("reg", "smol", "regai"), one = c(530L, 
541L, 539L), two = c(586L, 597L, 602L), three = c(435L, 447L, 
439L)), class = "data.frame", row.names = c(NA, -3L))

推荐阅读