Patrząc przez funkcję ave
znalazłem niezwykłą linię:Przypisanie do wyniku funkcji zmienia zmienną
split(x, g) <- lapply(split(x, g), FUN) # From ave
Co ciekawe, ta linia zmienia wartość x
, który znalazłam nieoczekiwane. Spodziewałem się, że split(x,g)
spowoduje wyświetlenie listy, do której można przypisać, ale później ją odrzucić. Moje pytanie brzmi, dlaczego zmienia się wartość x
?
Innym przykładem może lepiej wyjaśnić:
a <- data.frame(id=c(1,1,2,2), value=c(4,5,7,6))
# id value
# 1 1 4
# 2 1 5
# 3 2 7
# 4 2 6
split(a,a$id) # Split a row-wise by id into a list of size 2
# $`1`
# id value
# 1 1 4
# 2 1 5
# $`2`
# id value
# 3 2 7
# 4 2 6
# Find the row with highest value for each id
lapply(split(a,a$id),function(x) x[which.max(x$value),])
# $`1`
# id value
# 2 1 5
# $`2`
# id value
# 3 2 7
# Assigning to the split changes the data.frame a!
split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
a
# id value
# 1 1 5
# 2 1 5
# 3 2 7
# 4 2 7
Nie tylko a
zmieniło, ale zmieniona na wartość, która nie wygląda na prawej stronie przypisania! Nawet jeśli przypisanie do split(a,a$id)
w jakiś sposób zmienia a
(czego nie rozumiem), dlaczego powoduje to data.frame
zamiast list
?
Należy pamiętać, że rozumiem, że istnieją lepsze sposoby wykonania tego zadania. Moje pytanie brzmi: dlaczego split(a,a$id)<-lapply(split(a,a$id),function(x) x[which.max(x$value),])
zmienia a
?
Funkcja, którą wywołujesz, to 'split <-', a nie' split'. Są to dwie różne funkcje. Spójrz na 'split <-. Default' i jest oczywiste, dlaczego' a' się zmienia. –
Musisz użyć cudzysłowów, aby wydrukować tę funkcję, ponieważ nazwa funkcji zawiera operator: '\' split <-. Default \ ''. –
Czy w tym przypadku odpowiednia funkcja nie byłaby '\' split <-. Data.frame \ ''? – nograpes