假设我有示例数据帧(df):
strtok
现在我尝试一次添加2列并创建新列,即col1 + col2,col3 + col4,col5 + col6
期望的输出:
id col1 col2 col3 col4 col5 col6
1 2 3 2 6 2 8
2 3 2 4 1 3 2
3 4 2 9 7 8 7
4 7 6 3 2 9 2
我写了以下代码:
id col1 col2 col3 col4 col5 col6 t_1 t_3 t_5
1 2 3 2 6 2 8 5 8 10
2 3 2 4 1 3 2 5 5 5
3 4 2 9 7 8 7 6 16 15
4 7 6 3 2 9 2 13 5 11
但我得到以下错误:
粘贴错误(“df $ t”,i,sep =“_”)< - as.numeric(df [,: 赋值目标扩展为非语言对象`
我在这里做错了吗?
答案 0 :(得分:2)
根据预期的输出,我们可以对“df1'”的交替列进行子集化。没有第一个' id'列和我们+
具有相似维度的数据集,并根据该输出在原始数据集中创建新列。
df1[paste('t', c(1,3,5), sep="_")] <- df1[-1][c(TRUE, FALSE)]+
df1[-1][c(FALSE, TRUE)]
df1
# id col1 col2 col3 col4 col5 col6 t_1 t_3 t_5
#1 1 2 3 2 6 2 8 5 8 10
#2 2 3 2 4 1 3 2 5 5 5
#3 3 4 2 9 7 8 7 6 16 15
#4 4 7 6 3 2 9 2 13 5 11
为了清楚起见,第一步是删除第一列df1[-1]
,然后使用逻辑向量(c[TRUE, FALSE)]
)对每个交替列进行子集化。这将被循环到数据集的长度。
df1[-1][c(TRUE, FALSE)]
# col1 col3 col5
#1 2 2 2
#2 3 4 3
#3 4 9 8
#4 7 3 9
类似地,我们对下一对交替的列进行子集化。
df1[-1][c(FALSE, TRUE)]
# col2 col4 col6
#1 3 6 8
#2 2 1 2
#3 2 7 7
#4 6 2 2
两个子集数据集都具有相同的维度,因此我们只需+
即可获得+
对应元素的输出列
df1[-1][c(TRUE, FALSE)]+df1[-1][c(FALSE, TRUE)]
# col1 col3 col5
#1 5 8 10
#2 5 5 5
#3 6 16 15
#4 13 5 11
df1 <- structure(list(id = 1:4, col1 = c(2L, 3L, 4L, 7L), col2 = c(3L,
2L, 2L, 6L), col3 = c(2L, 4L, 9L, 3L), col4 = c(6L, 1L, 7L, 2L
), col5 = c(2L, 3L, 8L, 9L), col6 = c(8L, 2L, 7L, 2L)), .Names = c("id",
"col1", "col2", "col3", "col4", "col5", "col6"), class = "data.frame",
row.names = c(NA, -4L))
答案 1 :(得分:0)
这样做......
df$t_1 <- df$col1 + df$col2
df$t_3 <- df$col3 + df$col4
df$t_5 <- df$col5 + df$col6
您不需要运行循环。
答案 2 :(得分:0)
我认为值得一提的是Tyler Rinker采用的其他方法post适应了这个问题。我们创建一对列列表,以便稍后将其传递给lappy。最后,我们将原始数据帧(df1)和矩阵(df2)组合在一起。
n <- ncol(df1)
ind <- split(2:n, rep(2:n, each = 2, length = n - 1))
df2 <- do.call(cbind, lapply(ind, function(i) rowSums(df1[, i])))
cbind(df1, df2
输出:
id col1 col2 col3 col4 col5 col6 2 3 4
1 1 2 3 2 6 2 8 5 8 10
2 2 3 2 4 1 3 2 5 5 5
3 3 4 2 9 7 8 7 6 16 15
4 4 7 6 3 2 9 2 13 5 11