Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于多列中的最高值和另一列中的值标签指定列值_R - Fatal编程技术网

R 基于多列中的最高值和另一列中的值标签指定列值

R 基于多列中的最高值和另一列中的值标签指定列值,r,R,我需要一个函数来帮助在“ans”列中赋值,该列表示(c1l、c2l、c3l)之间的最大值-这些是与c1、c2、c3中的字符值相对应的数值。对于“ans”中的第1行,值“B”是从“ans”中的c2列分配的,因为13是c1l、c2l、c3l中的最高值,而c2l代表c2中的值标签(“B”)。如果所有其他列的值均为NA,则列“ans”将取c1l、c2l、c3l之间的唯一值,并将字符值从c1、c2、c3分配给ans。因此,此函数的逻辑类似于以下内容: 条件1: 如果最大值在c1l、c2l、c3l之间,则a

我需要一个函数来帮助在“ans”列中赋值,该列表示(c1l、c2l、c3l)之间的最大值-这些是与c1、c2、c3中的字符值相对应的数值。对于“ans”中的第1行,值“B”是从“ans”中的c2列分配的,因为13是c1l、c2l、c3l中的最高值,而c2l代表c2中的值标签(“B”)。如果所有其他列的值均为NA,则列“ans”将取c1l、c2l、c3l之间的唯一值,并将字符值从c1、c2、c3分配给ans。因此,此函数的逻辑类似于以下内容:

条件1: 如果最大值在c1l、c2l、c3l之间,则ans=c(i),且i在cols c1-c3之间

条件2: 如果c1l、c2l、c3l均为NA,则ans=c1

谢谢

c1<-c("A","B","NA","B")
c2<-c("B","C","D","A")
c3<-c("C","A","C","C")
c1l<-c(10,12,NA,NA)
c2l<-c(13,11,NA,NA)
c3l<-c(9,10,5,NA)
ans<-c("B","A","C","B")

c1我们可以使用
max.col

df <- data.frame(c1, c2, c3, c1l, c2l, c3l)
#get the value columns 
cols <- grep('c\\d+l', names(df))
#Replace NA with 0 and get the max value in each row
cols_index <- max.col(replace(df[cols], is.na(df[cols]), 0))
#If all the values are NA in a row replace it with NA
cols_index[rowSums(!is.na(df[cols]), na.rm = TRUE) == 0] <- NA
#get the corresponding label column creating a row/column matrix
df$ans <- df[-cols][cbind(1:nrow(df), cols_index)]
df$ans
#[1] "B" "B" "C" NA 

我们可以使用
max.col

df <- data.frame(c1, c2, c3, c1l, c2l, c3l)
#get the value columns 
cols <- grep('c\\d+l', names(df))
#Replace NA with 0 and get the max value in each row
cols_index <- max.col(replace(df[cols], is.na(df[cols]), 0))
#If all the values are NA in a row replace it with NA
cols_index[rowSums(!is.na(df[cols]), na.rm = TRUE) == 0] <- NA
#get the corresponding label column creating a row/column matrix
df$ans <- df[-cols][cbind(1:nrow(df), cols_index)]
df$ans
#[1] "B" "B" "C" NA 

谢谢,罗纳克。我需要做一点小小的修改。如果c1l-c3l没有值,而只有c1有值,例如“a”,但c2和c3有“NA”,则列ans将为该行获取“a”。目前,它显示为NA。再次感谢@DHR,如果c1l-c3l没有值,而c1和c2有一些值要选择哪个值呢?如果c1和c2都有值要选择,那么ans=NA,c3也一样。我提到的唯一例外情况是,cl1-3中没有数值,但c1、c2或c3都有一个值,无需选择。因此,如果cl1-3中没有值,且c1-3之间只有1个值可用,则ans根据c1-3分配值。在我的原始数据集中。c1、c2、c3,其中从字符串中分离的变量,例如(“country1/country2/country3”、“country1/country4”)和c1l-c3l是与国家相关的度量。感谢Ronak。我编辑了这个问题以反映附加条件。不过,我想我之前还没有解释清楚。请参阅帖子的“条件2”,如果您能调整代码,使ans中的NA在c1l-c3l均为NA时被c1取代,我们将不胜感激。谢谢谢谢,罗纳克。我需要做一点小小的修改。如果c1l-c3l没有值,而只有c1有值,例如“a”,但c2和c3有“NA”,则列ans将为该行获取“a”。目前,它显示为NA。再次感谢@DHR,如果c1l-c3l没有值,而c1和c2有一些值要选择哪个值呢?如果c1和c2都有值要选择,那么ans=NA,c3也一样。我提到的唯一例外情况是,cl1-3中没有数值,但c1、c2或c3都有一个值,无需选择。因此,如果cl1-3中没有值,且c1-3之间只有1个值可用,则ans根据c1-3分配值。在我的原始数据集中。c1、c2、c3,其中从字符串中分离的变量,例如(“country1/country2/country3”、“country1/country4”)和c1l-c3l是与国家相关的度量。感谢Ronak。我编辑了这个问题以反映附加条件。不过,我想我之前还没有解释清楚。请参阅帖子的“条件2”,如果您能调整代码,使ans中的NA在c1l-c3l均为NA时被c1取代,我们将不胜感激。谢谢