R 按条件将数据帧的一列与另一列分开

R 按条件将数据帧的一列与另一列分开,r,dataframe,R,Dataframe,我有一个包含两列的数据框,如下所示: cond val 1 5 2 18 2 18 2 18 3 30 3 30 我想通过以下方式更改val中的值: cond val 1 5 # 5 = 5/1 (only "1" in cond column) 2 6 # 6 = 18/3 (there are three "2" in cond column) 2 6

我有一个包含两列的数据框,如下所示:

cond  val
1      5
2      18
2      18
2      18
3      30
3      30
我想通过以下方式更改
val
中的值:

   cond  val
    1      5   # 5 = 5/1  (only "1" in cond column)
    2      6   # 6 = 18/3 (there are three "2" in cond column)
    2      6
    2      6
    3      15  # 15 = 30/2  
    3      15

如何实现这一点?

对于
数据来说,这似乎是一个合适的情况。表

library(data.table)
(dt <- data.table(df)[,val := val / .N, by = cond][])
#    cond val
# 1:    1   5
# 2:    2   6
# 3:    2   6
# 4:    2   6
# 5:    3  15
# 6:    3  15 
库(data.table)

(dt如果cond是一个ID变量,那么这是一个基本R答案:

# get length of repeats
temp <- rle(df$cond)
temp <- data.frame(cond=temp$values, lengths=temp$lengths)

# merge onto data.frame
df <- merge(df, temp, by="cond")
df$valNew <- df$val / df$lengths
#获取重复的长度
温度A基R溶液:

# method 1:
mydf$val <- ave(mydf$val, mydf$cond, FUN = function(x) x = x/length(x))
# method 2:
mydf <- transform(mydf, val = ave(val, cond, FUN = function(x) x = x/length(x)))
在R底

df$result = df$val / ave(df$cond, df$cond, FUN = length)

ave()
cond
列除以其唯一值,并取每个子向量的长度,即您要求的分母。

以下是
dplyr
的方法:

library(dplyr)
df %>%
  group_by(cond) %>%
  mutate(val = val / n())
其中:

  cond val
1    1   5
2    2   6
3    2   6
4    2   6
5    3  15
6    3  15
#Source: local data frame [6 x 2]
#Groups: cond [3]
#
#   cond   val
#  (int) (dbl)
#1     1     5
#2     2     6
#3     2     6
#4     2     6
#5     3    15
#6     3    15

这个想法是使用
n()

val
除以当前组(
cond
)中的观察数,
ave
的替代方法可以是
制表(df$cond)[df$cond]
#Source: local data frame [6 x 2]
#Groups: cond [3]
#
#   cond   val
#  (int) (dbl)
#1     1     5
#2     2     6
#3     2     6
#4     2     6
#5     3    15
#6     3    15