2013-05-13 62 views
46

Tôi có một số mixed dataframe của biến số và ký tự.Chuyển đổi từ chữ thường sang chữ hoa tất cả các giá trị trong tất cả các biến ký tự trong dataframe

city,hs_cd,sl_no,col_01,col_02,col_03 
Austin,1,2,,46,Female 
Austin,1,3,,32,Male 
Austin,1,4,,27,Male 
Austin,1,5,,20,Female 
Austin,2,2,,42,Female 
Austin,2,1,,52,Male 
Austin,2,3,,25,Male 
Austin,2,4,,22,Female 
Austin,3,3,,30,Female 
Austin,3,1,,65,Female 

Tôi muốn chuyển đổi tất cả các ký tự viết thường trong khung dữ liệu thành chữ hoa. Có cách nào để làm điều này trong một lần mà không làm nó lặp đi lặp lại trên mỗi biến ký tự?

Trả lời

57

Bắt đầu với các dữ liệu sau mẫu:

df <- data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],stringsAsFactors=FALSE) 

    v1 v2 v3 
1 a 1 j 
2 b 2 k 
3 c 3 l 
4 d 4 m 
5 e 5 n 

Bạn có thể sử dụng:

data.frame(lapply(df, function(v) { 
    if (is.character(v)) return(toupper(v)) 
    else return(v) 
})) 

Mà cho:

v1 v2 v3 
1 A 1 J 
2 B 2 K 
3 C 3 L 
4 D 4 M 
5 E 5 N 
+11

Tôi chỉ tìm thấy công trình này quá: df = as.data.frame (sapply (df, toupper)) – user702432

24

Từ gói dplyr bạn cũng có thể sử dụng mutate_all () kết hợp với toupper(). Điều này sẽ ảnh hưởng đến cả các lớp nhân vật và yếu tố.

library(dplyr) 
df <- mutate_all(df, funs=toupper) 
+1

Đối với bất kỳ ai nhìn vào điều này từ hôm nay trở đi, lưu ý rằng 'mutate_each()' được khấu hao; thay vào đó (giả sử bạn muốn chuyển đổi toàn bộ 'data.frame' thành upper/lower), sử dụng' mutate_all() '. – MusTheDataGuy

+0

'mutate_at()' có thể được sử dụng để làm việc chỉ với một biến – Kevin

4

Nhận xét phụ ở đây cho những người sử dụng bất kỳ câu trả lời nào trong số này. Câu trả lời của Juba rất tuyệt, vì nó rất có chọn lọc nếu các biến của bạn là chuỗi số hoặc chuỗi ký tự. Tuy nhiên, nếu bạn có kết hợp (ví dụ: a1, b1, a2, b2) vv. Nó sẽ không chuyển đổi các ký tự đúng cách.

Như @Trenton Hoffman nhấn mạnh,

library(dplyr) 
df <- mutate_each(df, funs(toupper)) 

ảnh hưởng đến cả hai lớp nhân vật và yếu tố và làm việc cho "biến hỗn hợp"; ví dụ. nếu biến của bạn chứa cả ký tự và giá trị số (ví dụ: a1) cả hai sẽ được chuyển đổi thành một yếu tố. Có thể nói đây không phải là quá nhiều của một mối quan tâm, nhưng nếu bạn muốn kết thúc trận đấu data.frames ví dụ

df3 <- df1[df1$v1 %in% df2$v1,] 

nơi df1 đã được đã được chuyển đổi và df2 chứa một tổ chức phi chuyển đổi data.frame hoặc tương tự , điều này có thể gây ra một số vấn đề. Công việc xung quanh là bạn nhanh chóng phải chạy

df2 <- df2 %>% mutate_each(funs(toupper), v1) 
#or 
df2 <- df2 %>% mutate_each(df2, funs(toupper)) 
#and then 
df3 <- df1[df1$v1 %in% df2$v1,] 

Nếu bạn làm việc với dữ liệu di truyền, điều này là khi biết điều này có thể hữu ích.

1

Nếu bạn cần để đối phó với data.frames bao gồm các yếu tố bạn có thể sử dụng:

df = data.frame(v1=letters[1:5],v2=1:5,v3=letters[10:14],v4=as.factor(letters[1:5]),v5=runif(5),stringsAsFactors=FALSE) 

df 
    v1 v2 v3 v4  v5 
    1 a 1 j a 0.1774909 
    2 b 2 k b 0.4405019 
    3 c 3 l c 0.7042878 
    4 d 4 m d 0.8829965 
    5 e 5 n e 0.9702505 


sapply(df,class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "factor" "numeric" 

Sử dụng mutate_each_ để chuyển đổi các yếu tố để nhân vật sau đó chuyển đổi tất cả các chữ hoa

upper_it = function(X){X %>% mutate_each_(funs(as.character(.)), names(.[sapply(., is.factor)])) %>% 
    mutate_each_(funs(toupper), names(.[sapply(., is.character)]))} # convert factor to character then uppercase 

Cho

upper_it(df) 
     v1 v2 v3 v4 
    1 A 1 J A 
    2 B 2 K B 
    3 C 3 L C 
    4 D 4 M D 
    5 E 5 N E 

Trong khi

sapply(upper_it(df),class) 
     v1   v2   v3   v4   v5 
"character" "integer" "character" "character" "numeric" 
0

Nó đơn giản với áp dụng hàm trong R

f < - áp dụng (f, 2, toupper)

Không cần phải kiểm tra xem cột là nhân vật hay bất cứ loại nào khác.

Các vấn đề liên quan