我想将每一行的// assuming 'search' holds the entire data queried from the api
const fullListing = [
// car of the week, data reformatted to have an identical structure as
// the 'other' cars
{
id: search.listing.details.identifier.id,
details: {
vehicle: search.listing.details.vehicle,
},
},
...search.listings.listings, // the 'other' cars
]
和Var1
的值相加,并产生一个标题为Var2
的新列,该列给出了Vars
和{{1 }}。然后,我想对Var1
和Var2
进行同样的操作,并新建一个标题为Col1
的列,该列给出Col2
和Cols
的总和。我该如何编写代码?预先感谢。
Col1
预期结果如下:
Col2
答案 0 :(得分:3)
假设列ID
不相关(无组),并且您很乐意指定列名(解决方案为硬编码,而不是通用)。
基本的R解决方案:
df$Vars <- rowSums(df1[, c("Var1", "Var2")])
df$Cols <- rowSums(df1[, c("Col1", "Col2")])
tidyverse解决方案:
library(dplyr)
library(purrr)
df %>% mutate(Vars = map2_int(Var1, Var2, sum),
Cols = map2_int(Col1, Col2, sum))
# or just
df %>% mutate(Vars = Var1 + Var2,
Cols = Col1 + Col2)
答案 1 :(得分:2)
有很多不同的方法可以做到这一点。与
library(dplyr)
df = df %>% #input dataframe
group_by(ID) %>% #do it for every ID, so every row
mutate( #add columns to the data frame
Vars = Var1 + Var2, #do the calculation
Cols = Col1 + Col2
)
但是还有许多其他方式,例如,应用功能等。我建议阅读有关tidyverse的信息。
答案 2 :(得分:1)
另一种dplyr
方法是使用辅助函数starts_with
选择列,然后使用rowSums
对这些列求和。
library(dplyr)
df$Vars <- df %>% select(starts_with("Var")) %>% rowSums()
df$Cols <- df %>% select(starts_with("Col")) %>% rowSums()
df
# ID Var1 Var2 Col1 Col2 Vars Cols
#1 1 34 22 34 24 56 58
#2 2 3 25 54 65 28 119
#3 3 87 68 14 78 155 92
#4 4 66 98 98 100 164 198
#5 5 55 13 77 2 68 79
答案 3 :(得分:0)
一个汇总所有列的解决方案的名称相同,并在 base 中使用gsub
以数字结尾:
tt <- paste0(gsub('[[:digit:]]+', '', names(df)[-1]),"s")
df <- cbind(df, sapply(unique(tt), function(x) {rowSums(df[grep(x, tt)+1])}))
df
# ID Var1 Var2 Col1 Col2 Vars Cols
#1 1 34 22 34 24 56 58
#2 2 3 25 54 65 28 119
#3 3 87 68 14 78 155 92
#4 4 66 98 98 100 164 198
#5 5 55 13 77 2 68 79
或更通用的解决方案:
idx <- grep('[[:digit:]]', names(df))
tt <- paste0(gsub('[[:digit:]]+', '', names(df)[idx]),"s")
df <- cbind(df, sapply(unique(tt), function(x) {rowSums(df[idx[grep(x, tt)]])}))