2017-12-22 2 views
1

lapply을 사용하여 특정 변수 값에 레이블을 지정하고 싶습니다. 내가 가까이에 (here) 얻을 수 있지만 데이터 집합의 특정 변수에 대해서만 작동하도록 얻을 수없는 예제를 발견했습니다.lapply를 사용하여 특정 변수 값에 레이블 지정

근무 예 : 여기

df1 <- tribble(
~var1, ~var2, ~var3, ~var4, 
"1", "1", "1", "a", 
"2", "2", "2", "b", 
"3", "3", "3", "c" 
) 

는 작동합니다 것 같다 코드,하지만하지 않습니다 : 코드가 실행

df1["var1", "var2"] <- lapply(df1["var1", "var2"], factor, 
          levels=c(1, 
            2, 
            3), 
          labels = c("Agree", 
            "Neither Agree/Disagree", 
            "Disagree")) 

을하지만, 다음과 같은 출력 제공 :

# A tibble: 4 x 4 
    var1 var2 var3 var4 
* <chr> <chr> <chr> <chr> 
1  1  1  1  a 
2  2  2  2  b 
3  3  3  3  c 
4 <NA> <NA> <NA> <NA> 

변수 하나만 사용하면 작동합니다.

df1["var1"] <- lapply(df1["var1"], factor, 
          levels=c(1, 
           2, 
           3), 
          labels = c("Agree", 
            "Neither Agree/Disagree", 
            "Disagree")) 

이 (올바른) 다음과 같은 출력 제공 : 나는 그것이 작동하도록하는 코드를 변경할 수있는 다른 방법을 많이 시도

# A tibble: 3 x 4 
        var1 var2 var3 var4 
        <fctr> <chr> <chr> <chr> 
1     Agree  1  1  a 
2 Neither Agree/Disagree  2  2  b 
3    Disagree  3  3  c 

,하지만 난 그냥 그것을 알아낼 수 없습니다 아웃.

+0

단지 'DF1 [C ("VAR1", "VAR2")]'또는'DF1을 사용하여 [1 : 2]' – Onyambu

답변

2

귀하의 문제가 발생한다.

data.frame 또는 tbl에서 [을 사용하여 추출하는 방법은 두 가지가 있습니다. 데이터가 matrix -like 직사각형 형태이기 때문에

  • , 특정 값을 얻기 위해 [row, column] 방법을 사용할 수 있습니다. 예를 들어 단일 값을 얻으려면 df1[2, 1]과 같은 작업을 수행 할 수 있습니다.
  • tbl/data.frame은 특별한 유형의 list이므로 쉼표를 제공하지 않으면 전체 목록 요소를 원한다고 가정합니다. 당신이 ["var1", "var2"]을했을 때

따라서, 그것은 matrix 부분 집합 모드로 가서 그것을 찾을 수 없습니다 "VAR1"라는 행을 찾고, 그래서 그것은 당신의 데이터 세트에서 NA 값의 행을 삽입했다.

다음은 실험 할 수있는 몇 가지 예제입니다.data.framelist

입니다 여부를 [row, column] 접근 방식을

df["Mazda RX4", "mpg"] # [row, column] 
# [1] 21 
  • 확인을 사용하여 단일 값을 추출 4

    df <- mtcars[1:4, 1:4] 
    df 
    #     mpg cyl disp hp 
    # Mazda RX4  21.0 6 160 110 
    # Mazda RX4 Wag 21.0 6 160 110 
    # Datsun 710  22.8 4 108 93 
    # Hornet 4 Drive 21.4 6 258 110 
    
  • : 4, 열 1 :

    • 행 1 받기

      is.list(df) 
      # [1] TRUE 
      
    • data.framelist A를 변환하고 [row, column]를 사용하여 추출하려고합니다. data.frame 때문에

      df[c("mpg", "hp")] 
      #     mpg hp 
      # Mazda RX4  21.0 110 
      # Mazda RX4 Wag 21.0 110 
      # Datsun 710  22.8 93 
      # Hornet 4 Drive 21.4 110 
      
      L[c("mpg", "hp")] 
      # $mpg 
      # [1] 21.0 21.0 22.8 21.4 
      # 
      # $hp 
      # [1] 110 110 93 110 
      
    • 추출하는 data.frame 또는 값의 벡터를 제공하는 list

      df["mpg"]    # Treats it as asking for a single value from a list 
      #     mpg 
      # Mazda RX4  21.0 
      # Mazda RX4 Wag 21.0 
      # Datsun 710  22.8 
      # Hornet 4 Drive 21.4 
      
      L["mpg"] 
      # $mpg 
      # [1] 21.0 21.0 22.8 21.4 
      
    • 로부터 추출하는 하나 개의 값을 제공

      L <- unclass(df) 
      L["Mazda RX4", "mpg"] # A list doesn't have `dim`s. 
      # Error in L["Mazda RX4", "mpg"] : incorrect number of dimensions 
      
    • 특별한 유형빈을 사용 dim들과 list의마음에 그 세부 사항을 유지 NA

      df["not here", ] 
      # mpg cyl disp hp 
      # NA NA NA NA NA 
      

    가 반환되지 않은 행을 찾고

    df[, c("mpg", "hp")] 
    #     mpg hp 
    # Mazda RX4  21.0 110 
    # Mazda RX4 Wag 21.0 110 
    # Datsun 710  22.8 93 
    # Hornet 4 Drive 21.4 110 
    
  • 일 것이다, 당신의 가장 좋은 방법은 (단지 사용하는 것입니다 @www's answer에서 제안 :

    df1[c("var1", "var2")] 
    
  • +0

    감사 A5C1D2H2I1M1N2O1R2T1 @ 너무 많이! 이것은 R과 코딩의 논리를 더 잘 이해하는 데 도움이되는 종류의 대답입니다. 매우 감사. – scottsmith

    2

    가까운 사이. 열을 지정하려면 df1[c("var1", "var2")]이 필요합니다. 당신이 당신의 data.frame 잘못의 서브 세트를 위해 노력하고 있기 때문에

    df1[c("var1", "var2")] <- lapply(df1[c("var1", "var2")], factor, 
               levels=c("1", 
                 "2", 
                 "3"), 
               labels = c("Agree", 
                 "Neither Agree/Disagree", 
                 "Disagree")) 
    df1 
    # # A tibble: 3 x 4 
    #      var1     var2 var3 var4 
    #     <fctr>     <fctr> <chr> <chr> 
    # 1     Agree     Agree  1  a 
    # 2 Neither Agree/Disagree Neither Agree/Disagree  2  b 
    # 3    Disagree    Disagree  3  c 
    
    +0

    아, 좋아. 그런 간단한 일. 나는 그 실수를 다시하지 않을 것이다. 고맙습니다. @www! – scottsmith

    관련 문제