R语言 如何比较两列中的值,如果值相等,保持原样,但如果值不同,则逐行求和

ohtdti5x  于 2023-06-27  发布在  其他
关注(0)|答案(2)|浏览(215)

使用R,我想比较两列中的值,如果值相等,我想保持它们原样,如果值不同,我想对两列中的值求和。这似乎是一个简单的操作,但我不知道如何做到,已经找到类似的帖子SO,但不完全是这样。如果有其他的东西可能?
示例df:

structure(list(colA = c(0, 0, 0, 412.99, 34.43, 117.36, 193.05, 
305.22), colB = c(0, 0, 0, 412.99, 6.89, 0, 193.05, 305.22)), class = "data.frame", row.names = c(1323L, 
5426L, 2772L, 7241L, 2547L, 874L, 5908L, 6830L))

如果A和B的值不同(在本例中,求和34.43和6.89(对于行2547)并保持412.99(行7241;因为colA和colB的值相同)。另外,具有另一列(例如“colD”)将是有帮助的,该列以某种方式声明行是否相同(以知道哪些obs不同)。
我的实际df有10,000+个观测值和30+个变量(列)。我只想比较30多个列中的两列。谢谢你。

ldxq2e6h

ldxq2e6h1#

ifelse()可能会有帮助。

df <- structure(list(colA = c(0, 0, 0, 412.99, 34.43, 117.36, 193.05, 
                        305.22), colB = c(0, 0, 0, 412.99, 6.89, 0, 193.05, 305.22)), class = "data.frame", row.names = c(1323L, 
                                                                                                                          5426L, 2772L, 7241L, 2547L, 874L, 5908L, 6830L))
df |>
  dplyr::mutate(colC = ifelse(colA == colB, colA, colA+colB))
#>        colA   colB   colC
#> 1323   0.00   0.00   0.00
#> 5426   0.00   0.00   0.00
#> 2772   0.00   0.00   0.00
#> 7241 412.99 412.99 412.99
#> 2547  34.43   6.89  41.32
#> 874  117.36   0.00 117.36
#> 5908 193.05 193.05 193.05
#> 6830 305.22 305.22 305.22

创建于2023-06-19带有reprex v2.0.2

uxhixvfz

uxhixvfz2#

使用data.table
选项1:如果行名称很重要,则使用setDT(df, keep.rownames = TRUE)

library(data.table)

df <- structure(list(colA = c(0, 0, 0, 412.99, 34.43, 117.36, 193.05, 305.22), 
                     colB = c(0, 0, 0, 412.99, 6.89, 0, 193.05, 305.22)), 
                class = "data.frame", 
                row.names = c(1323L, 5426L, 2772L, 7241L, 2547L, 874L, 5908L, 6830L))

setDT(df)

df[, `:=`(colC = colA, colD = 1L)]
df[colA != colB, `:=`(colC = colA + colB, colD = 0)][]

     colA   colB   colC colD
1:   0.00   0.00   0.00    1
2:   0.00   0.00   0.00    1
3:   0.00   0.00   0.00    1
4: 412.99 412.99 412.99    1
5:  34.43   6.89  41.32    0
6: 117.36   0.00 117.36    0
7: 193.05 193.05 193.05    1
8: 305.22 305.22 305.22    1

选项2:类似于@Grzegorz Sapijaszko的答案

library(data.table)

df <- structure(list(colA = c(0, 0, 0, 412.99, 34.43, 117.36, 193.05, 305.22), 
                     colB = c(0, 0, 0, 412.99, 6.89, 0, 193.05, 305.22)), 
                class = "data.frame", 
                row.names = c(1323L, 5426L, 2772L, 7241L, 2547L, 874L, 5908L, 6830L))

setDT(df)

df[, colC := fifelse(colA == colB, colA, colA + colB)][] #Analogous for `colD`

     colA   colB   colC
1:   0.00   0.00   0.00
2:   0.00   0.00   0.00
3:   0.00   0.00   0.00
4: 412.99 412.99 412.99
5:  34.43   6.89  41.32
6: 117.36   0.00 117.36
7: 193.05 193.05 193.05
8: 305.22 305.22 305.22

相关问题