แทนที่องค์ประกอบเวกเตอร์อักขระใน dataframe ด้วยค่าใน R

ฉันมี dataframe ที่มีคอลัมน์อักขระหลายคอลัมน์อยู่ในนั้น คอลัมน์ประกอบด้วยสตริงข้อความและสตริงข้อความว่าง ฉันต้องการแทนที่สตริงข้อความว่างทั้งหมดภายใน dataframe ด้วย 0 และองค์ประกอบที่มีสตริงด้วยหมายเลข 1 แต่ยังนึกไม่ออกว่าต้องทำอย่างไร....

ตัวอย่างง่ายๆ เพื่อแสดงให้เห็น:

> df
       A   B  C
1: asdad       
2:           sd
3:    as  sd sd
4: daasd  sd   
5:        sd   
6:           sd
7:    ds sds   
8:   asd       
9:        sd sd

> str(df)
Classes ‘data.table’ and 'data.frame':  9 obs. of  3 variables:
 $ A: chr  "asdad" "" "as" "daasd" ...
 $ B: chr  "" "" "sd" "sd" ...
 $ C: chr  "" "sd" "sd" "" ...
 - attr(*, ".internal.selfref")=<externalptr> 

เป็นที่ต้องการ :

> df
   A B C
1: 1 0 0
2: 0 0 1
3: 1 1 1
4: 1 1 0
5: 0 1 0
6: 0 0 1
7: 1 1 0
8: 1 0 0
9: 0 1 1

str(df)
Classes ‘data.table’ and 'data.frame':  9 obs. of  3 variables:
 $ A: int  1 0 1 1 0 0 1 1 0
 $ B: int  0 0 1 1 1 0 1 0 1
 $ C: int  0 1 1 0 0 1 0 0 1
 - attr(*, ".internal.selfref")=<externalptr> 

person jonas    schedule 17.12.2014    source แหล่งที่มา


คำตอบ (1)


ต่อไปนี้เป็นคำตอบแบบเวกเตอร์ง่ายๆ

(df != "") + 0
#    A B C
# 1: 1 0 0
# 2: 0 0 1
# 3: 1 1 1
# 4: 1 1 0
# 5: 0 1 0
# 6: 0 0 1
# 7: 0 1 1
# 8: 1 0 0
# 9: 0 1 1

หากคุณมีวัตถุ data.table ให้เพิ่ม as.data.table ใน

as.data.table((df != "") + 0)

คำอธิบายบางส่วน

เมื่อคุณทำ df != "" โดยพื้นฐานแล้ว R จะเป็นการเปรียบเทียบแต่ละค่าใน df ถึง "" (ว่าง) และส่งกลับเมทริกซ์เชิงตรรกะโดยที่ TRUE และ FALSE บ่งชี้สำหรับแต่ละค่าว่าเท่ากับ "" หรือไม่ เมื่อเพิ่ม + 0 ค่าตรรกะจะถูกแปลงเป็น 1 และ 0


แก้ไข:

หากคุณมีวัตถุ data.table และต้องการอัปเดตโดยการอ้างอิงคุณสามารถทำได้

df[, names(df) := lapply(.SD, function(x) (!x %in% c("", " ")) + 0)]
person David Arenburg    schedule 17.12.2014
comment
ทำงานได้ดีกับตัวอย่าง แต่ไม่ใช่กับชุดข้อมูลดั้งเดิมของฉัน มาก 1 ที่ไม่ควรมี อืม อาจมีช่องว่างหรือบางอย่างในชุดข้อมูล ความคิดใด ๆ ในการแก้ไขปัญหานี้ - person jonas; 18.12.2014
comment
ฉันไม่สามารถบอกได้หากไม่มีข้อมูลจริง ขออภัย - person David Arenburg; 18.12.2014
comment
พยายามดูชุดย่อยของมันใน Excel และมีช่องว่างในชุดข้อมูล .. คำแนะนำใด ๆ - person jonas; 18.12.2014
comment
อาจจะ ((df != "") & (df != " ")) + 0? - person David Arenburg; 18.12.2014
comment
เยี่ยมเลย ขอบคุณ!! เพียงเท่านี้ ฉันต้องเรียนรู้เคล็ดลับมายากลนี้ เคล็ดลับใด ๆ - person jonas; 18.12.2014
comment
ไม่มีเวทย์มนตร์จริงๆ เพิ่มคำอธิบายสำหรับคำตอบ ลองเรียกใช้ df != "" แล้วดูว่าคุณจะได้อะไร - person David Arenburg; 18.12.2014
comment
ดูการแก้ไขของฉัน ฉันได้เพิ่มตัวเลือกในการอัปเดตโดยการอ้างอิงหากคุณมีวัตถุ data.table นั่นอาจจะสะดวกกว่าสำหรับคุณ - person David Arenburg; 18.12.2014