我有一个包含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循环更好的方法或类似的东西,也许在某些库中有这样的功能?我将不得不做很多类似的操作,所以我想要一个简化的方法。
答案 0 :(得分: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的gather
和spread
并排列出A
和B
列。然后,您可以计算总和并将其转换回预期的data.frame。只要您的data.frame具有相同数量的A
和B
列,它就可以正常工作。