#r
#r
Вопрос:
Я пытаюсь заполнить недостающие строки таблицы соответствующим заголовком и нулем под ним. Я также пытаюсь выполнить деление с таблицей.
nba <- read.csv('nbadatasort.csv',header=FALSE)
one <- grepl('\Q \E',nba$V2)
two <- grepl('\Q*\E',nba$V2)
three <- grepl('\Q^\E',nba$V2)
needed <- one | two | three
allstar <- subset.data.frame(nba, needed)
#This table lets me know how many people are in each draft number: It will return the following:
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 24 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25 25
#54 55 56 57 58 59 60
#25 20 20 20 19 11 10
table(nba$V1)
#This table lets me know how many all stars each draft number had. It will return the following:
#1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 24 25 28 29 30 31 32 35 37 38 43 45 47 48 51 57 60
#17 9 11 8 9 6 3 1 8 8 4 2 1 2 2 4 2 3 2 3 4 1 1 1 2 1 2 2 1 1 1 1 2 2 1 1 1
table(allstar$V1)
Моя цель — взять вторую таблицу (allstar $ V1) и заполнить ее таким образом, чтобы между 11 и тринадцатью было 12, а под 12 — ноль. Затем я хочу разделить каждое нижнее значение таблицы allstar на таблицу nba, чтобы получить значение .68 для 1, .36 для 2 и так далее.
Любая помощь очень ценится. Спасибо.
Комментарии:
1. Вместо того, чтобы использовать
"\Q\E"
для экранирования специальных символов регулярного выражения, вы также можете использоватьfixed = TRUE
аргумент вgrepl
, чтобы обрабатывать все вpattern =
аргументе как фиксированную строку.
Ответ №1:
Если я правильно понял ваш вопрос, вы пытаетесь найти процентное соотношение всех звезд для каждого номера черновика. Вот метод, использующий базу R:
# Create test datasets
set.seed(123)
nba = sample(1:60, 500, replace = TRUE)
allstar = sample(1:60, 100, replace = TRUE)
# Count the occurences of each draft number and convert to dataframe
nbadf = as.data.frame(table(nba))
allstardf = as.data.frame(table(allstar))
# Check the two dataframes
unique(nbadf$nba)
unique(allstardf$allstar)
> unique(nbadf$nba)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
[28] 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60
60 Levels: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ... 60
> unique(allstardf$allstar)
[1] 1 2 3 4 5 6 8 10 11 13 17 18 19 20 21 22 23 24 25 26 27 28 30 31 32 33 34
[28] 35 36 40 41 42 43 45 46 47 49 50 52 53 54 55 56 57 58 59 60
47 Levels: 1 2 3 4 5 6 8 10 11 13 17 18 19 20 21 22 23 24 25 26 27 28 30 31 ... 60
Как вы можете видеть, во фрейме данных nba есть 60 уникальных номеров драфта, но только 47 уникальных номеров драфта во фрейме данных allstar (аналогично тому, что у вас есть). Теперь merge
два фрейма данных используют «nba» в nbadf и «allstar» в allstardf в качестве ключей. all = TRUE
Означает, что мы хотим внешнего соединения, чего мы и добиваемся:
# Use merge to "Outer Join" the two dataframes
fullDF = merge(nbadf, allstardf, by.x = "nba", by.y = "allstar", all = TRUE)
# Replace the NA produced by the missing rows in allstardf with zeros
fullDF[is.na(fullDF)] = 0
# Calculate percentage of allstars for each draft number
fullDF$Percent = with(fullDF, Freq.y/Freq.x)
# Optionally rename the columns
names(fullDF) = c("Draft_Num", "All", "AllStar", "AllStarPercent")
> head(fullDF)
Draft_Num All AllStar AllStarPercent
1 1 6 1 0.1666667
2 2 4 3 0.7500000
3 3 7 3 0.4285714
4 4 8 2 0.2500000
5 5 6 3 0.5000000
6 6 8 2 0.2500000