У меня есть 8 возрастных категорий, каждая из которых имеет свой собственный столбец (например, резиденты_до_5, жители_от_6_до_12 и т. д. Каждый столбец имеет значение от 0 до 3 для количества людей в этом домохозяйстве в этой конкретной возрастной категории. Что мне нужно, так это новый столбец, с помощью которого я могу отобразить общее распределение возраста моего населения на гистограмме. Итак, я думал о столбце, в котором 66 строк Resident_Under_5, 32 строки Residents_6_to_12 и т. д. для суммы этих категорий.
Мои данные выглядят так:
a b c d
0 3 2 1
1 3 2 1
2 0 2 1
3 1 0 0
Мне нужен столбец e, который показывает:
e
a
a
a
a
b
b
b
b
b
c
c
c
d
d
d
Для общего количества вхождений в других столбцах.
Я пытался объявить новые столбцы с помощью sum(residents_under_5)
, но это даст мне 1 строку с 66 (как сумму этой категории). Я не могу построить гистограмму с таким столбцом. Я надеюсь, что кто-то может понять это!
Это dput() соответствующих столбцов.
residents_under_5 = c(0, 0, 0, 1, 1, 2),
residents_6_to_12 = c(0, 0, 0, 0, 0, 0),
residents_13_to_18 = c(0, 0, 0, 0, 0, 0),
residents_19_to_24 = c(0,
0, 0, 0, 0, 0),
residents_25_to_34 = c(0, 1, 2, 0, 1, 0),
residents_35_to_49 = c(0, 0, 0, 2, 1, 2),
residents_50_to_64 = c(0,
1, 0, 0, 0, 0),
residents_65_and_older = c(2, 0, 0, 0, 1,
0)
Я просто предоставил некоторые данные, показывающие мою проблему
Можете ли вы предоставить dput() вашего базового набора данных?
При условии, что @RandallHelms
Вы можете unlist
фрейм данных и вычислить частоты, используя table
, а затем повторить letters
, используя rep
.
rep(letters[seq_len(ncol(df))], colSums(df))
данные
df <- data.frame(residents_under_5 = c(0, 0, 0, 1, 1, 2),
residents_6_to_12 = c(0, 0, 0, 0, 0, 0),
residents_13_to_18 = c(0, 0, 0, 0, 0, 0),
residents_19_to_24 = c(0, 0, 0, 0, 0, 0),
residents_25_to_34 = c(0, 1, 2, 0, 1, 0),
residents_35_to_49 = c(0, 0, 0, 2, 1, 2),
residents_50_to_64 = c(0, 1, 0, 0, 0, 0),
residents_65_and_older = c(2, 0, 0, 0, 1, 0))
Это также работает для таблицы данных? У меня больше столбцов, чем эти 4, как мне указать только нужные столбцы? Мне просто написать «имена» или что должно быть вместо этого? Спасибо!
@BenGill При этом учитываются все столбцы, будь то 4 или 100. Вам может потребоваться подмножество столбцов, если вы хотите их игнорировать. Например, чтобы игнорировать 1-й столбец, мы можем сделать rep(names(df)[-1], table(unlist(df)[-1]))
По-видимому, это не работает, поскольку в моем наборе данных есть отрицательные значения (ошибка: недопустимый аргумент «раз»)
@BenGill Я создаю новый фрейм данных, используя dput
ваших соответствующих столбцов, и обновляю ответ: «Можете ли вы проверить сейчас?»
это дает мне 5000 строк "а"
@BenGill Я попытался перечитать ваш вопрос и обновил ответ. Убедитесь, что в df
есть только соответствующие столбцы. Посмотрите, сработает ли это для вас, иначе я удалю пост, так как не могу вам помочь.
Большое спасибо! Теперь это сработало. Сначала я создал новую таблицу данных только с соответствующими столбцами. Ваш код дал мне вектор с правильными значениями. Я объявил его в новую переменную как фрейм данных и теперь нанесу его на гистограмму!
Вариантом в tidyverse
будет получение sum
всех столбцов с summarise_all
, gather
в «длинном» формате и uncount
столбца «значение».
library(tidyverse)
df1 %>%
summarise_all(sum) %>%
gather %>%
uncount(value)
df1 <- structure(list(a = 0:3, b = c(3L, 3L, 0L, 1L), c = c(2L, 2L,
2L, 0L), d = c(1L, 1L, 1L, 0L)), class = "data.frame", row.names = c(NA,
-4L))
Что-то вроде этого: stackoverflow.com/questions/31461357/…?