Заполните отсутствующие столбцы нулями, затем разделите нижнюю строку таблицы на нижнюю строку другой таблицы

#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