【问题标题】:Count occurrences of value in a set of variables in R (per row) - with weights计算 R(每行)中一组变量中值的出现次数 - 使用权重
【发布时间】:2018-08-13 16:31:42
【问题描述】:

我有以下 df8 数据框:

df8=data.frame(V1=c(10,20,10,20),V2=c(20,30,20,30),V3=c(20,10,20,10))

这是每行的值出现次数:

a<-apply(df8,MARGIN=1,table)

> a
[[1]]

10 20 
 1  2 

[[2]]

10 20 30 
 1  1  1 

[[3]]

10 20 
 1  2 

[[4]]

10 20 30 
 1  1  1 

我有一个向量 - V = (0.25,0.25,0.5) 这意味着我想将每行的每个出现次数乘以每行的向量V: 我想得到这样的东西来计算(将每个不同行值的列权重相加): [[1]]

   10  20 
 0.25  0.5

[[2]]

   10   20  30 
 0.5 0.25 0.25 

[[3]]

 10     20 
 0.25  0.5

[[4]]

 10   20   30 
 0.5 0.25 0.25 

现在我想为每一行选择具有最高 a*V 值的项目:

> df8
  V1 V2 V3 max_val
1 10 20 20   20
2 20 30 10   10
3 10 20 20   20
4 20 30 10   10

【问题讨论】:

  • a * V?没有办法使用原子V
  • 这只是一个说明性示例。我想通过权重向量计算每个值的权重并找到最大总和。

标签: r dataframe vector apply


【解决方案1】:

一个选项可以将table 函数应用于每一行并找出每一列中值的出现。然后,V 中定义的因子将应用于每一列,以找到最大 freq*V 值的列的索引。来自该行值的index 的值将是所需的值。

#Multiplier for occurrence in each column
V = c(0.25,0.25,0.5)

#data frame
df8=data.frame(V1=c(10,20,10,20),V2=c(20,30,20,30),V3=c(20,10,20,10))

# This function accepts all columns for a row. Finds frequencies for each
# column values and then multiply with V (column wise)
# Finally value in row at index with max(freq*V) is returned.

find_max_freq_val <- function(x){
  freq_df <- as.data.frame(table(x))
  freq_vec <- mapply(function(y)freq_df[freq_df$x==y,"Freq"], x)
  #multiply with V with freq and find index of max(a*V)
  #Then return item at that index from x
  x[which((freq_vec*V) == max(freq_vec*V))]

}

# call above function to add an column with desired value
df8$new_val <- apply(df8, 1, find_max_freq_val)

df8
#  V1 V2 V3 new_val
#1 10 20 20      20
#2 20 30 10      10
#3 10 20 20      20
#4 20 30 10      10

【讨论】:

  • apply(df8,1,max)
  • @Onyambu。正确的。这样会更好。
  • 谢谢@MKR,但请注意我不需要最大编号。出现次数,但次数乘以向量 - V.
  • @MKR,我得到错误的结果:> df8 V1 V2 V3 max_val 1 10 20 20 10.0 2 20 30 10 7.5 3 10 20 20 10.0 4 20 30 10 7.5
  • @Avi 我想,我对最初显示的预期值感到困惑。我已经按照您描述的逻辑修改了我的答案。在新解决方案中,table 按行应用。看看吧。
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多