Idris Raja
2012-Feb-09 22:56 UTC
[R] Apply pmax to dataframe with different args based on dataframe factor
# I have a dataframe in the following form:
track <- c(rep('A', 3), rep('B', 4), rep('C', 4))
value <- c(0.15, 0.25, 0.35, 0.05, 0.99, 0.32, 0.13, 0.80, 0.75, 0.60, 0.44)
df <- data.frame(track=factor(track), value=value)
#> print(df)
#track value
#1 A 0.15
#2 A 0.25
#3 A 0.35
#4 B 0.05
#5 B 0.99
#6 B 0.32
#7 B 0.13
#8 C 0.80
#9 C 0.75
#10 C 0.60
#11 C 0.44
# If any of the values are below a threshold value, I want to replace it
with the
# threshold value. The twist is that there is a different threshold value
for
# every track.
# I tried something like this, but it's not working
threshold <- list()
threshold['A'] <- 0.2
threshold['B'] <- 0.4
threshold['C'] <- 0.5
for (track in levels(df$track)){
df[df$track==track,]$outcome <- pmax(df[df$track==track,]$outcome,
threshold[track])
}
# Warning messages:
# 1: In is.na(mmm) : is.na() applied to non-(list or vector) of type
'NULL'
# 2: In is.na(mmm) : is.na() applied to non-(list or vector) of type
'NULL'
# 3: In is.na(mmm) : is.na() applied to non-(list or vector) of type
'NULL'
#******************
# Desired Results:
#> print(df)
#track value
#1 A 0.20 # value changed
#2 A 0.25
#3 A 0.35
#4 B 0.40 # value changed
#5 B 0.99
#6 B 0.40 # value changed
#7 B 0.40 # value changed
#8 C 0.80
#9 C 0.75
#10 C 0.60
#11 C 0.50 # value changed
# Any ideas? Thanks for reading.
[[alternative HTML version deleted]]
ilai
2012-Feb-10 04:11 UTC
[R] Apply pmax to dataframe with different args based on dataframe factor
Your attempt was just overly complicated. All you needed was threshold <- c( .2 , .4 , .5 )[ df$track ] df$value <- pmax(threshold, df$value) df # desired outcome Cheers On Thu, Feb 9, 2012 at 3:56 PM, Idris Raja <idris.raja at gmail.com> wrote:> # I have a dataframe in the following form: > > track <- c(rep('A', 3), rep('B', 4), rep('C', 4)) > value <- c(0.15, 0.25, 0.35, 0.05, 0.99, 0.32, 0.13, 0.80, 0.75, 0.60, 0.44) > df <- data.frame(track=factor(track), value=value) > > #> print(df) > ? #track value > #1 ? ? ?A ?0.15 > #2 ? ? ?A ?0.25 > #3 ? ? ?A ?0.35 > #4 ? ? ?B ?0.05 > #5 ? ? ?B ?0.99 > #6 ? ? ?B ?0.32 > #7 ? ? ?B ?0.13 > #8 ? ? ?C ?0.80 > #9 ? ? ?C ?0.75 > #10 ? ? C ?0.60 > #11 ? ? C ?0.44 > > > # If any of the values are below a threshold value, I want to replace it > with the > # threshold value. The twist is that there is a different threshold value > for > # every track. > > # I tried something like this, but it's not working > > threshold <- list() > threshold['A'] <- 0.2 > threshold['B'] <- 0.4 > threshold['C'] <- 0.5 > > > for (track in levels(df$track)){ > ? ?df[df$track==track,]$outcome <- pmax(df[df$track==track,]$outcome, > ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? threshold[track]) > } > # Warning messages: > # 1: In is.na(mmm) : is.na() applied to non-(list or vector) of type 'NULL' > # 2: In is.na(mmm) : is.na() applied to non-(list or vector) of type 'NULL' > # 3: In is.na(mmm) : is.na() applied to non-(list or vector) of type 'NULL' > > > #****************** > # Desired Results: > > #> print(df) > ? #track value > #1 ? ? ?A ?0.20 # value changed > #2 ? ? ?A ?0.25 > #3 ? ? ?A ?0.35 > #4 ? ? ?B ?0.40 # value changed > #5 ? ? ?B ?0.99 > #6 ? ? ?B ?0.40 # value changed > #7 ? ? ?B ?0.40 # value changed > #8 ? ? ?C ?0.80 > #9 ? ? ?C ?0.75 > #10 ? ? C ?0.60 > #11 ? ? C ?0.50 # value changed > > > # Any ideas? Thanks for reading. > > ? ? ? ?[[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.
Seemingly Similar Threads
- Question about subsetting S4 object in ROCR
- About basic logical operators
- help - "the condition has length > 1 and only the first element will be used"
- problem with heatmap.2 in package gplots generating non-finite breaks
- Finding a Diff within a Dataframe columns