将许多列(现有列的功能)附加到数据框

问题描述 投票:-3回答:1

我有一个包含200列的数据框:A_1,...,A_100,B_1,...,B_100。 A的条目是1到5或NA的整数,而B的条目是-1,0,1,NA。

我想追加100个列:C_1,...,C_100,其中C_i = A_i + B_i,除非它会产生0或6,在这种情况下它应保持不变。

在清晰度和计算复杂性方面,在R中执行此操作的最佳方法是什么?必须有比for循环更好的方法或类似的东西,也许在某些库中有这样的功能?我将不得不做很多类似的操作,所以我想要一个简化的方法。

r
1个回答
1
投票

你可以试试:

library(tidyverse)
# some data
d <- data.frame(A_1=1:10, 
           A_2=1:10, 
           A_3=1:10, 
           B_1=11:20, 
           B_2=21:30, 
           B_3=31:40) 
d %>% 
  gather(key, value) %>% 
     separate(key, into = c("a","b")) %>% 
     group_by(b, a) %>% 
     mutate(n=row_number())  %>% 
     unite(a2,b, n) %>% 
     spread(a, value) %>%  
     mutate(Sum=A+B) %>% 
     separate(a2, into = c("a", "b"), remove = T) %>% 
     select(-A,-B) %>% 
     mutate(a=paste0("C_",a)) %>% 
     spread(a, Sum) %>% 
     arrange(as.numeric(b)) %>% 
     left_join(d %>% rownames_to_column(), by=c("b"="rowname"))
# A tibble: 10 x 10
       b   C_1   C_2   C_3   A_1   A_2   A_3   B_1   B_2   B_3
   <chr> <int> <int> <int> <int> <int> <int> <int> <int> <int>
 1     1    12    22    32     1     1     1    11    21    31
 2     2    14    24    34     2     2     2    12    22    32
 3     3    16    26    36     3     3     3    13    23    33
 4     4    18    28    38     4     4     4    14    24    34
 5     5    20    30    40     5     5     5    15    25    35
 6     6    22    32    42     6     6     6    16    26    36
 7     7    24    34    44     7     7     7    17    27    37
 8     8    26    36    46     8     8     8    18    28    38
 9     9    28    38    48     9     9     9    19    29    39
10    10    30    40    50    10    10    10    20    30    40

这个想法是使用tidyr的gatherspread来并排AB。然后,您可以计算总和并将其转换回预期的data.frame。只要您的data.frame具有相同数量的AB列,它就可以工作了。

© www.soinside.com 2019 - 2024. All rights reserved.