R 如何基于列索引为列赋值

R 如何基于列索引为列赋值,r,R,有了数据帧,我想根据给定的列索引分配一个计算值 df <- data.frame(a = c(2,4,7,3,5,3), b = c(8,3,8,2,6,1)) > df a b 1 2 8 2 4 3 3 7 8 4 3 2 5 5 6 6 3 1 max <- apply(df, 1, which.max) > max [1] 2 1 2 1 2 1 addition <- apply(df, 1, sum) > addi

有了数据帧,我想根据给定的列索引分配一个计算值

df <- data.frame(a = c(2,4,7,3,5,3), b = c(8,3,8,2,6,1))

> df
   a b
 1 2 8     
 2 4 3
 3 7 8
 4 3 2
 5 5 6
 6 3 1

max <- apply(df, 1, which.max)
> max
[1] 2 1 2 1 2 1

addition <- apply(df, 1, sum)
> addition
[1] 10  7 15  5 11  4

非常感谢您的想法和帮助。谢谢

您可以使用
cbind
访问每行的选定列:

df2 = df
df2[cbind(1:nrow(df2),max)] = addition
df2
  a  b
1 2 10
2 7  3
3 7 15
4 5  2
5 5 11
6 4  1

这里,
cbind
返回一个由2列6行组成的矩阵,我们使用该矩阵使用矩阵子集对数据帧进行子集设置。

您可以使用
cbind
访问每行的选定列:

df2 = df
df2[cbind(1:nrow(df2),max)] = addition
df2
  a  b
1 2 10
2 7  3
3 7 15
4 5  2
5 5 11
6 4  1

在这里,
cbind
返回一个由2列6行组成的矩阵,我们使用该矩阵使用矩阵子集对数据帧进行子集设置。

您也可以直接使用矢量化的
ifelse

with(df, cbind.data.frame(a = ifelse(a > b, a + b, a), b = ifelse(a > b, b, a + b)));
#  a  b
#1 2 10
#2 7  3
#3 7 15
#4 5  2
#5 5 11
#6 4  1

您也可以直接使用矢量化的
ifelse

with(df, cbind.data.frame(a = ifelse(a > b, a + b, a), b = ifelse(a > b, b, a + b)));
#  a  b
#1 2 10
#2 7  3
#3 7 15
#4 5  2
#5 5 11
#6 4  1

您可以使用
max.col
rowsumes
df[cbind(seq(nrow(df)),max.col(df))]进行
apply
调用,非常感谢!我认为左侧缺少
cbind()
。我尝试使用
df[,max]很好地使用
df[,c(2,1,2,1,2,1)]
例如,将选择整个第2列、第1列、第2列、第1列等,从而生成一个包含6列和6行的数据帧。这就是为什么在尝试将其指定为加法向量时会出现错误。这里,
cbind()
返回一个
matrix
,我们使用它来子集数据帧。您可以不用
apply
调用
max.col
rowSums
df[cbind(seq(nrow(df)),max.col(df))]非常感谢!我认为左侧缺少
cbind()
。我尝试使用
df[,max]很好地使用
df[,c(2,1,2,1,2,1)]
例如,将选择整个第2列、第1列、第2列、第1列等,从而生成一个包含6列和6行的数据帧。这就是为什么在尝试将其指定为加法向量时会出现错误。这里,
cbind()
返回一个
矩阵
,我们使用该矩阵对数据帧进行子集划分。谢谢!这很有效。If试图避免使用ifelse语句,因为我觉得它的位置更优雅。但尽管如此,这也行得通,我认为这对读者来说更清楚了。@JeanPaul不用担心,很乐意帮忙。请记住,
ifelse
是矢量化的,因此与
cbind
方法进行基准测试比较,看看哪种方法更快会很有趣。谢谢!这很有效。If试图避免使用ifelse语句,因为我觉得它的位置更优雅。但尽管如此,这也行得通,我认为这对读者来说更清楚了。@JeanPaul不用担心,很乐意帮忙。请记住,
ifelse
是矢量化的,因此与
cbind
方法进行基准测试比较,看看哪种方法更快是很有趣的。