นี่เป็นวิธีแก้ปัญหา (ค่อนข้างซับซ้อน) (สำหรับปัญหาที่ค่อนข้างซับซ้อน):
ข้อมูล:
df <- data.frame(
id = 1:2,
amenities = c('{"Wireless Internet","Wheelchair accessible",Kitchen,Elevator,"Buzzer/wireless intercom",Heating,Washer,Dryer,Essentials,Shampoo,Hangers,"Laptop friendly workspace"}',
'{TV,"Cable TV",Internet,"Wireless Internet","Air conditioning",Kitchen,"Smoking allowed","Pets allowed","Buzzer/wireless intercom",Heating,"Family/kid friendly","Smoke detector","Carbon monoxide}'))
เตรียมข้อมูล:
amenities_clean <- gsub('[{}"]', '', df$amenities) # remove unwanted stuff
amenities_split <- strsplit(amenities_clean, ",") # split rows into individual amenities
amenities_unique <- unique(unlist(strsplit(amenities_clean, ","))) # get a list of unique amenities
df[amenities_unique] <- NA # set up the columns for each amenity
ตอนนี้สำหรับการวิเคราะห์เนื้อโดยใช้ str_detect
จากแพ็คเกจ stringr
:
# record presence/absence of individual amenities in each new column:
library(stringr)
for(i in 1:ncol(df[amenities_unique])){
for(j in 1:nrow(df)){
df[amenities_unique][j,i] <-
ifelse(str_detect(amenities_split[j], names(df[amenities_unique][i])), 1, 0)
}
}
สิ่งนี้จะแจ้งคำเตือน แต่ดูเหมือนว่าจะไม่มีนัยสำคัญเนื่องจากผลลัพธ์ถูกต้อง:
df
id
1 1
2 2
amenities
1 {"Wireless Internet","Wheelchair accessible",Kitchen,Elevator,"Buzzer/wireless intercom",Heating,Washer,Dryer,Essentials,Shampoo,Hangers,"Laptop friendly workspace"}
2 {TV,"Cable TV",Internet,"Wireless Internet","Air conditioning",Kitchen,"Smoking allowed","Pets allowed","Buzzer/wireless intercom",Heating,"Family/kid friendly","Smoke detector","Carbon monoxide}
Wireless Internet Wheelchair accessible Kitchen Elevator Buzzer/wireless intercom Heating Washer Dryer
1 1 1 1 1 1 1 1 1
2 1 0 1 0 1 1 0 0
Essentials Shampoo Hangers Laptop friendly workspace TV Cable TV Internet Air conditioning Smoking allowed
1 1 1 1 1 0 0 1 0 0
2 0 0 0 0 1 1 1 1 1
Pets allowed Family/kid friendly Smoke detector Carbon monoxide
1 0 0 0 0
2 1 1 1 1
แก้ไข:
อีกทางหนึ่งและอาจประหยัดกว่า แทนที่จะเป็น for
loop ที่ซ้อนกัน คุณสามารถใช้ฟังก์ชัน apply
เช่นนี้ (ขึ้นอยู่กับเวกเตอร์ amenities_split
และ amenities_unique
จากขั้นตอนการเตรียมการของโซลูชันแรก):
cbind(df, t(sapply(amenities_split, function(x)
table(factor(x, levels = amenities_unique)))))
person
Chris Ruehlemann
schedule
26.04.2020
df
คุณสามารถทำได้:amenities_clean <- gsub('[{}"]', '', df$amenities) # remove unwanted stuff amenities_unique <- unique(unlist(strsplit(amenities_clean, ","))) # get a list of unique amenities df[amenities_unique] <- NA # set up the columns for each amenity
- person Chris Ruehlemann   schedule 19.04.2020