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
方法进行基准测试比较,看看哪种方法更快是很有趣的。